static void unload(ErlNifEnv* env, void* priv) { NifModPrivData* data = (NifModPrivData*) priv; add_call(env, data, "unload"); NifModPrivData_release(data); }
static void unload(ErlNifEnv* env, void* priv_data) { PrivData* data = priv_data; add_call(env, data, "unload"); if (--data->ref_cnt == 0) { if (data->nif_mod != NULL) { NifModPrivData_release(data->nif_mod); } enif_free(priv_data); } }
static int upgrade(ErlNifEnv* env, void** priv, void** old_priv_data, ERL_NIF_TERM load_info) { NifModPrivData* data = (NifModPrivData*) *old_priv_data; int retval = 0; init(env); add_call(env, data, "upgrade"); data->ref_cnt++; *priv = *old_priv_data; do_load_info(env, load_info, &retval); if (retval) NifModPrivData_release(data); return retval; }
static ERL_NIF_TERM hold_nif_mod_priv_data(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { PrivData* data = (PrivData*) enif_priv_data(env); unsigned long ptr_as_ulong; if (!enif_get_ulong(env,argv[0],&ptr_as_ulong)) { return enif_make_badarg(env); } if (data->nif_mod != NULL) { NifModPrivData_release(data->nif_mod); } data->nif_mod = (NifModPrivData*) ptr_as_ulong; return enif_make_int(env,++(data->nif_mod->ref_cnt)); }
static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info) { NifModPrivData* data; int retval = 0; init(env); data = (NifModPrivData*) enif_alloc(sizeof(NifModPrivData)); CHECK(data != NULL); *priv = data; data->mtx = enif_mutex_create("nif_mod_priv_data"); data->ref_cnt = 1; data->call_history = NULL; add_call(env, data, "load"); do_load_info(env, load_info, &retval); if (retval) NifModPrivData_release(data); return retval; }