erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

57 linhas
1.7 KiB

#include <string.h>
#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<ErlNifResourceFlags>(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<shared_data *>(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<shared_data *>(priv_data);
enif_free(data);
}
int on_nif_upgrade(ErlNifEnv *env, void **priv, void **, ERL_NIF_TERM) {
shared_data *data = static_cast<shared_data *>(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)