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

5 anos atrás
  1. #include <string.h>
  2. #include "enlfq_nif.h"
  3. #include "enlfq.h"
  4. #include "nif_utils.h"
  5. const char kAtomOk[] = "ok";
  6. const char kAtomError[] = "error";
  7. const char kAtomTrue[] = "true";
  8. //const char kAtomFalse[] = "false";
  9. //const char kAtomUndefined[] = "undefined";
  10. const char kAtomEmpty[] = "empty";
  11. atoms ATOMS;
  12. void open_resources(ErlNifEnv *env, shared_data *data) {
  13. ErlNifResourceFlags flags = static_cast<ErlNifResourceFlags>(ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER);
  14. data->resQueueInstance = enif_open_resource_type(env, NULL, "enlfq_instance", nif_enlfq_free, flags, NULL);
  15. }
  16. int on_nif_load(ErlNifEnv *env, void **priv_data, ERL_NIF_TERM) {
  17. ATOMS.atomOk = make_atom(env, kAtomOk);
  18. ATOMS.atomError = make_atom(env, kAtomError);
  19. ATOMS.atomTrue = make_atom(env, kAtomTrue);
  20. // ATOMS.atomFalse = make_atom(env, kAtomFalse);
  21. // ATOMS.atomUndefined = make_atom(env, kAtomUndefined);
  22. ATOMS.atomEmpty = make_atom(env, kAtomEmpty);
  23. shared_data *data = static_cast<shared_data *>(enif_alloc(sizeof(shared_data)));
  24. open_resources(env, data);
  25. *priv_data = data;
  26. return 0;
  27. }
  28. void on_nif_unload(ErlNifEnv *, void *priv_data) {
  29. shared_data *data = static_cast<shared_data *>(priv_data);
  30. enif_free(data);
  31. }
  32. int on_nif_upgrade(ErlNifEnv *env, void **priv, void **, ERL_NIF_TERM) {
  33. shared_data *data = static_cast<shared_data *>(enif_alloc(sizeof(shared_data)));
  34. open_resources(env, data);
  35. *priv = data;
  36. return 0;
  37. }
  38. static ErlNifFunc nif_funcs[] =
  39. {
  40. {"new", 0, nif_enlfq_new},
  41. {"push", 2, nif_enlfq_push},
  42. {"pop", 1, nif_enlfq_pop}
  43. };
  44. ERL_NIF_INIT(enlfq, nif_funcs, on_nif_load, NULL, on_nif_upgrade, on_nif_unload)