# Does libjulia support dynamic reinitialization?

**URL:** https://discourse.julialang.org/t/does-libjulia-support-dynamic-reinitialization/108035
**Category:** Internals & Design
**Tags:** question
**Created:** [December 25, 2023, 1:27pm UTC](https://discourse.julialang.org/t/does-libjulia-support-dynamic-reinitialization/108035 "2023-12-25T13:27:30Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![Yurii\_Hamann](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yurii_hamann/32/205724_2.png) [@Yurii\_Hamann](https://discourse.julialang.org/u/Yurii_Hamann)
#### Post date: [December 25, 2023, 1:27pm UTC](https://discourse.julialang.org/t/does-libjulia-support-dynamic-reinitialization/108035/1 "2023-12-25T13:27:30Z")

</div>

I need a dynamic Julia re-initialization but I guess it’s not supported or there is a bug in the `libjulia` because in the example below variable `x` keeps it’s previous value after second `jl_init` call.

```julia
#include <julia.h>
#include <stdio.h>

int64_t getX() {
  jl_value_t *x = jl_eval_string("x");
  return jl_unbox_int64(x);
}

int main(int argc, char *argv[]) {

  jl_init();

  jl_eval_string("x::Int64 = 19");

  printf("x: %d\n", getX());

  jl_atexit_hook(0);

  jl_init();

  jl_eval_string("x=x+1");

  printf("x: %d\n", getX());

  jl_atexit_hook(0);

  return 0;
}

```

Output:  
x: 19  
x: 20

---

<div class="post-metadata">

### Author: ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)
#### Post date: [December 25, 2023, 10:33pm UTC](https://discourse.julialang.org/t/does-libjulia-support-dynamic-reinitialization/108035/2 "2023-12-25T22:33:36Z")

</div>

Have you considered dynamically loading libjulia.so and then unloading the shared library via `dlopen` and then `dlclose`?

@GunnarFarneback has an example here:

> <https://gist.github.com/GunnarFarneback/df2910fa9460cd267b37416f3efea77b#file-test_dynamic_loading-c>
>
> There are more than three files. show original

I’m not completely sure this is supported, but this would be my best guess.

---

<div class="post-metadata">

### Author: ![Yurii\_Hamann](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yurii_hamann/32/205724_2.png) [@Yurii\_Hamann](https://discourse.julialang.org/u/Yurii_Hamann)
#### Post date: [December 26, 2023, 8:01am UTC](https://discourse.julialang.org/t/does-libjulia-support-dynamic-reinitialization/108035/3 "2023-12-26T08:01:31Z")

</div>

I have considered to use dlopen/dlclose but it would be better to have more convenient option to work with the library. Anyway thank you for example, it can be useful for me.

---

<div class="post-metadata">

### Author: ![GunnarFarneback](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gunnarfarneback/32/1827_2.png) [@GunnarFarneback](https://discourse.julialang.org/u/GunnarFarneback)
#### Post date: [December 26, 2023, 8:51am UTC](https://discourse.julialang.org/t/does-libjulia-support-dynamic-reinitialization/108035/4 "2023-12-26T08:51:25Z")

</div>

This is more developed if you want to look into dynamically loading `libjulia`: [GitHub - GunnarFarneback/DynamicallyLoadedEmbedding.jl: Embed Julia with dynamical loading of libjulia at runtime.](https://github.com/GunnarFarneback/DynamicallyLoadedEmbedding.jl)

---

<div class="post-metadata">

### Author: ![Yurii\_Hamann](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yurii_hamann/32/205724_2.png) [@Yurii\_Hamann](https://discourse.julialang.org/u/Yurii_Hamann)
#### Post date: [December 27, 2023, 1:12pm UTC](https://discourse.julialang.org/t/does-libjulia-support-dynamic-reinitialization/108035/5 "2023-12-27T13:12:44Z")

</div>

Unfortunately dynamic library loading/unloading gives the same result ☹

```julia
#include <stdint.h>
#include <stdio.h>
#include <windows.h>

#define JULIA_LIB \
  "Julia-1.9.4\\bin\\libjulia." \
  "dll"

HMODULE libjulia;

#define JL_NOTSAFEPOINT

typedef struct _jl_value_t jl_value_t;
typedef struct _jl_sym_t jl_sym_t;
typedef struct _jl_module_t jl_module_t;
typedef jl_value_t jl_function_t;

static void (*jl_init)(void);
static void (*jl_atexit_hook)(int);
static jl_value_t *(*jl_eval_string)(const char *);
static int64_t (*jl_unbox_int64)(jl_value_t *v) JL_NOTSAFEPOINT;

static void *load_function(const char *name, int *success) {
  void *p = GetProcAddress(libjulia, name);

  if (!p) {
    fprintf(stderr, "%s not found in libjulia.\n", name);
    *success = 0;
  }

  return p;
}

void julia_init() {
  libjulia = LoadLibrary(JULIA_LIB);
  if (libjulia == NULL) {
    fprintf(stderr, "libjulia isn't found.\n");
    exit(1);
  }
  int success = 1;
  jl_init = load_function("jl_init", &success);
  jl_atexit_hook = load_function("jl_atexit_hook", &success);
  jl_eval_string = load_function("jl_eval_string", &success);
  jl_unbox_int64 = load_function("jl_unbox_int64", &success);

  if (!success) {
    fprintf(stderr, "libjulia intialization failed.\n");
  }

  jl_init();
}

void julia_deinit() {
  jl_atexit_hook(0);
  BOOL res = FreeLibrary(libjulia);
  if (res == FALSE) {
    fprintf(stderr, "libjulia library unloading failure.\n");
  }
}

int64_t getX() {
  jl_value_t *x = jl_eval_string("x");
  return jl_unbox_int64(x);
}

int main(int argc, char *argv[]) {

  julia_init();

  jl_eval_string("x::Int64 = 19");

  printf("x: %lld\n", getX());

  julia_deinit();

  julia_init();

  jl_eval_string("x=x+1");

  printf("x: %lld\n", getX());

  julia_deinit();

  return 0;
}

```

x: 19  
x: 20
