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.

71 lines
1.5 KiB

  1. #include <stdint.h>
  2. #include "erl_nif.h"
  3. #define CACHE_LINE_SIZE 64
  4. #define SLOT_INDEX(__index, __size) __index & (__size - 1)
  5. #define Q_MASK 3L
  6. #define Q_PTR(__ptr) (cq_node_t *) (((uint64_t)__ptr) & (~Q_MASK))
  7. #define Q_COUNT(__ptr) ((uint64_t) __ptr & Q_MASK)
  8. #define Q_SET_COUNT(__ptr, __val) (cq_node_t *) ((uint64_t) __ptr | (__val & Q_MASK))
  9. #define STATE_EMPTY 0
  10. #define STATE_WRITE 1
  11. #define STATE_READ 2
  12. #define STATE_FULL 3
  13. ErlNifResourceType* CQ_RESOURCE;
  14. typedef struct cq_node cq_node_t;
  15. struct cq_node {
  16. ErlNifEnv *env;
  17. //ERL_NIF_TERM term;
  18. ErlNifPid *value;
  19. cq_node_t *next;
  20. };
  21. typedef struct cq_queue {
  22. cq_node_t *head;
  23. cq_node_t *tail;
  24. } cq_queue_t;
  25. // TODO: Add padding between the fields
  26. typedef struct cq {
  27. uint32_t id;
  28. uint64_t queue_size;
  29. uint64_t overflow_size;
  30. uint64_t head;
  31. uint64_t tail;
  32. uint8_t *slots_states;
  33. ERL_NIF_TERM *slots_terms;
  34. ErlNifEnv **slots_envs;
  35. cq_queue_t *push_queue;
  36. cq_queue_t *pop_queue;
  37. uint8_t *overflow_states;
  38. ERL_NIF_TERM *overflow_terms;
  39. ErlNifEnv **overflow_envs;
  40. } cq_t;
  41. cq_t **QUEUES = NULL; /* Initialized on nif load */
  42. ERL_NIF_TERM mk_atom(ErlNifEnv* env, const char* atom);
  43. ERL_NIF_TERM mk_error(ErlNifEnv* env, const char* msg);
  44. int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info);
  45. void free_resource(ErlNifEnv*, void*);
  46. cq_queue_t* new_queue(void);
  47. void enqueue(cq_queue_t *q, ErlNifPid *pid);