aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2015-10-20 02:24:32 +0200
committerLoïc Hoguin <[email protected]>2015-10-20 02:24:32 +0200
commit054be80416dbd7f853ffd680d1b90323acd2074f (patch)
tree42cc8067f40e41942b144f3ca36c9483964ed898
parent35fe8bdd42e1ebe0438e15a53c7affa415e00ce0 (diff)
downloadesdl2-054be80416dbd7f853ffd680d1b90323acd2074f.tar.gz
esdl2-054be80416dbd7f853ffd680d1b90323acd2074f.tar.bz2
esdl2-054be80416dbd7f853ffd680d1b90323acd2074f.zip
Don't crash on code reloading
-rw-r--r--c_src/esdl2.c20
-rw-r--r--c_src/nif_helpers.h1
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, ...);