From 054be80416dbd7f853ffd680d1b90323acd2074f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Tue, 20 Oct 2015 02:24:32 +0200 Subject: Don't crash on code reloading --- c_src/esdl2.c | 20 ++++++++++++++++++-- c_src/nif_helpers.h | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/c_src/esdl2.c b/c_src/esdl2.c index 1613901..430847f 100644 --- a/c_src/esdl2.c +++ b/c_src/esdl2.c @@ -18,6 +18,8 @@ NIF_ATOMS(NIF_ATOM_DECL) NIF_RESOURCES(NIF_RES_DECL) +static int loads = 0; + int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) { NIF_ATOMS(NIF_ATOM_INIT) @@ -25,16 +27,30 @@ int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) *priv_data = nif_create_main_thread("esdl2"); + loads++; + + return 0; +} + +int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info) +{ + *priv_data = *old_priv_data; + + loads++; + return 0; } void unload(ErlNifEnv* env, void* priv_data) { - nif_destroy_main_thread(priv_data); + if (loads == 1) + nif_destroy_main_thread(priv_data); + + loads--; } static ErlNifFunc nif_funcs[] = { NIF_FUNCTIONS(NIF_FUNCTION_ARRAY) }; -ERL_NIF_INIT(esdl2, nif_funcs, load, NULL, NULL, unload) +ERL_NIF_INIT(esdl2, nif_funcs, load, NULL, upgrade, unload) diff --git a/c_src/nif_helpers.h b/c_src/nif_helpers.h index 6454d27..8c1cfa4 100644 --- a/c_src/nif_helpers.h +++ b/c_src/nif_helpers.h @@ -121,6 +121,7 @@ typedef void* nif_thread_arg; void* nif_create_main_thread(char*); +void nif_destroy_main_thread(void*); ERL_NIF_TERM nif_thread_cast(ErlNifEnv*, void (*f)(nif_thread_arg*), int a, ...); ERL_NIF_TERM nif_thread_call(ErlNifEnv*, ERL_NIF_TERM (*f)(ErlNifEnv*, nif_thread_arg*), int a, ...); -- cgit v1.2.3