#include #include "enlfq_nif.h" #include "enlfq.h" #include "nif_utils.h" const char kAtomOk[] = "ok"; const char kAtomError[] = "error"; const char kAtomTrue[] = "true"; //const char kAtomFalse[] = "false"; //const char kAtomUndefined[] = "undefined"; const char kAtomEmpty[] = "empty"; atoms ATOMS; void open_resources(ErlNifEnv *env, shared_data *data) { ErlNifResourceFlags flags = static_cast(ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER); data->resQueueInstance = enif_open_resource_type(env, NULL, "enlfq_instance", nif_enlfq_free, flags, NULL); } int on_nif_load(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM) { ATOMS.atomOk = make_atom(env, kAtomOk); ATOMS.atomError = make_atom(env, kAtomError); ATOMS.atomTrue = make_atom(env, kAtomTrue); // ATOMS.atomFalse = make_atom(env, kAtomFalse); // ATOMS.atomUndefined = make_atom(env, kAtomUndefined); ATOMS.atomEmpty = make_atom(env, kAtomEmpty); shared_data *data = static_cast(enif_alloc(sizeof(shared_data))); open_resources(env, data); *priv_data = data; return 0; } void on_nif_unload(ErlNifEnv *, void *priv_data) { shared_data *data = static_cast(priv_data); enif_free(data); } int on_nif_upgrade(ErlNifEnv *env, void **priv, void **, ERL_NIF_TERM) { shared_data *data = static_cast(enif_alloc(sizeof(shared_data))); open_resources(env, data); *priv = data; return 0; } static ErlNifFunc nif_funcs[] = { {"new", 0, nif_enlfq_new}, {"push", 2, nif_enlfq_push}, {"pop", 1, nif_enlfq_pop} }; ERL_NIF_INIT(enlfq, nif_funcs, on_nif_load, NULL, on_nif_upgrade, on_nif_unload)