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.

56 lines
1.7 KiB

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