erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 line
2.1 KiB

5 年之前
  1. #include <string.h> /* memcmp,strlen */
  2. #include "epqueue_nif.h"
  3. #include "epqueue.h"
  4. #include "epqueue_item.h"
  5. #include "nif_utils.h"
  6. #include "macros.h"
  7. const char kAtomOk[] = "ok";
  8. const char kAtomError[] = "error";
  9. const char kAtomTrue[] = "true";
  10. const char kAtomFalse[] = "false";
  11. const char kAtomUndefined[] = "undefined";
  12. const char kAtomGlobalLock[] = "global_lock";
  13. atoms ATOMS;
  14. void open_resources(ErlNifEnv* env, epqueue_data* data)
  15. {
  16. ErlNifResourceFlags flags = static_cast<ErlNifResourceFlags>(ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER);
  17. data->resPQueueInstance = enif_open_resource_type(env, NULL, "pqueue_instance", nif_epqueue_free, flags, NULL);
  18. data->resPQueueItem = enif_open_resource_type(env, NULL, "pqueue_item", epqueue_item_free, flags, NULL);
  19. }
  20. int on_nif_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
  21. {
  22. UNUSED(load_info);
  23. ATOMS.atomOk = make_atom(env, kAtomOk);
  24. ATOMS.atomError = make_atom(env, kAtomError);
  25. ATOMS.atomTrue = make_atom(env, kAtomTrue);
  26. ATOMS.atomFalse = make_atom(env, kAtomFalse);
  27. ATOMS.atomUndefined = make_atom(env, kAtomUndefined);
  28. ATOMS.atomGlobalLock = make_atom(env, kAtomGlobalLock);
  29. epqueue_data* data = static_cast<epqueue_data*>(enif_alloc(sizeof(epqueue_data)));
  30. open_resources(env, data);
  31. *priv_data = data;
  32. return 0;
  33. }
  34. void on_nif_unload(ErlNifEnv* env, void* priv_data)
  35. {
  36. UNUSED(env);
  37. epqueue_data* data = static_cast<epqueue_data*>(priv_data);
  38. enif_free(data);
  39. }
  40. int on_nif_upgrade(ErlNifEnv* env, void** priv, void** old_priv, ERL_NIF_TERM info)
  41. {
  42. UNUSED(old_priv);
  43. UNUSED(info);
  44. epqueue_data* data = static_cast<epqueue_data*>(enif_alloc(sizeof(epqueue_data)));
  45. open_resources(env, data);
  46. *priv = data;
  47. return 0;
  48. }
  49. static ErlNifFunc nif_funcs[] =
  50. {
  51. {"new", 1, nif_epqueue_new},
  52. {"insert", 3, nif_epqueue_insert},
  53. {"remove", 2, nif_epqueue_remove},
  54. {"pop", 1, nif_epqueue_pop},
  55. {"peek", 1, nif_epqueue_peek},
  56. {"size", 1, nif_epqueue_size}
  57. };
  58. ERL_NIF_INIT(epqueue_nif, nif_funcs, on_nif_load, NULL, on_nif_upgrade, on_nif_unload)