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.

84 lines
2.0 KiB

5 years ago
  1. #include "enlfq.h"
  2. #include "enlfq_nif.h"
  3. #include "nif_utils.h"
  4. #include "concurrentqueue.h"
  5. struct q_item {
  6. ErlNifEnv *env;
  7. ERL_NIF_TERM term;
  8. };
  9. struct squeue {
  10. moodycamel::ConcurrentQueue<q_item> *queue;
  11. };
  12. void nif_enlfq_free(ErlNifEnv *, void *obj) {
  13. squeue *inst = static_cast<squeue *>(obj);
  14. if (inst != nullptr) {
  15. q_item item;
  16. while (inst->queue->try_dequeue(item)) {
  17. enif_free_env(item.env);
  18. }
  19. delete inst->queue;
  20. }
  21. }
  22. ERL_NIF_TERM nif_enlfq_new(ErlNifEnv *env, int, const ERL_NIF_TERM *) {
  23. shared_data *data = static_cast<shared_data *>(enif_priv_data(env));
  24. squeue *qinst = static_cast<squeue *>(enif_alloc_resource(data->resQueueInstance, sizeof(squeue)));
  25. qinst->queue = new moodycamel::ConcurrentQueue<q_item>;
  26. if (qinst == NULL)
  27. return make_error(env, "enif_alloc_resource failed");
  28. ERL_NIF_TERM term = enif_make_resource(env, qinst);
  29. enif_release_resource(qinst);
  30. return enif_make_tuple2(env, ATOMS.atomOk, term);
  31. }
  32. ERL_NIF_TERM nif_enlfq_push(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]) {
  33. shared_data *data = static_cast<shared_data *>(enif_priv_data(env));
  34. squeue *inst;
  35. if (!enif_get_resource(env, argv[0], data->resQueueInstance, (void **) &inst)) {
  36. return enif_make_badarg(env);
  37. }
  38. q_item item;
  39. item.env = enif_alloc_env();
  40. item.term = enif_make_copy(item.env, argv[1]);
  41. inst->queue->enqueue(item);
  42. return ATOMS.atomTrue;
  43. }
  44. ERL_NIF_TERM nif_enlfq_pop(ErlNifEnv *env, int, const ERL_NIF_TERM argv[]) {
  45. shared_data *data = static_cast<shared_data *>(enif_priv_data(env));
  46. squeue *inst = NULL;
  47. if (!enif_get_resource(env, argv[0], data->resQueueInstance, (void **) &inst)) {
  48. return enif_make_badarg(env);
  49. }
  50. ERL_NIF_TERM term;
  51. q_item item;
  52. if (inst->queue->try_dequeue(item)) {
  53. term = enif_make_copy(env, item.term);
  54. enif_free_env(item.env);
  55. return enif_make_tuple2(env, ATOMS.atomOk, term);
  56. } else {
  57. return ATOMS.atomEmpty;
  58. }
  59. }