erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
2.2 KiB

  1. /*
  2. * etsq.h
  3. *
  4. * Created on: Mar 21, 2016
  5. * Author: Vinod
  6. */
  7. #ifndef ETSQ_H_
  8. #define ETSQ_H_
  9. #include <iostream> // std::cin, std::cout
  10. #include <map> // std::map
  11. #include <queue> // std::queue
  12. #include <string.h>
  13. #include "erl_nif.h"
  14. #define enif_make_error(env, error) enif_make_tuple2(env, \
  15. enif_make_atom(env, "error"), enif_make_atom(env, error))
  16. struct cmp_str
  17. {
  18. bool operator()(char *a, char *b) const
  19. {
  20. return strcmp(a, b) < 0;
  21. }
  22. };
  23. class ErlTerm
  24. {
  25. public:
  26. ErlNifEnv *term_env;
  27. ERL_NIF_TERM term;
  28. public:
  29. ErlTerm(ERL_NIF_TERM erl_nif_term)
  30. {
  31. term_env = enif_alloc_env();
  32. this->term = enif_make_copy(term_env, erl_nif_term);
  33. }
  34. ErlTerm(ErlTerm *erl_term)
  35. {
  36. term_env = enif_alloc_env();
  37. this->term = enif_make_copy(term_env, erl_term->term);
  38. }
  39. ErlTerm(int value)
  40. {
  41. term_env = enif_alloc_env();
  42. this->term = enif_make_int(term_env, value);
  43. }
  44. ErlTerm(const char *error)
  45. {
  46. term_env = enif_alloc_env();
  47. this->term = enif_make_error(term_env, error);
  48. }
  49. ~ErlTerm()
  50. {
  51. enif_free_env(term_env);
  52. term_env = NULL;
  53. }
  54. };
  55. typedef std::queue<ErlTerm*> ErlQueue;
  56. class QueueInfo
  57. {
  58. public:
  59. ErlNifMutex* pmutex;
  60. ErlQueue queue;
  61. public:
  62. QueueInfo(char* name)
  63. {
  64. pmutex = enif_mutex_create(name);
  65. }
  66. ~QueueInfo()
  67. {
  68. enif_mutex_destroy(pmutex);
  69. }
  70. };
  71. typedef std::map<char *, QueueInfo*, cmp_str> QInfoMap;
  72. typedef std::pair<char *, QueueInfo*> QInfoMapPair;
  73. // Class to handle Read lock
  74. class ReadLock
  75. {
  76. ErlNifRWLock *pread_lock;
  77. public:
  78. ReadLock(ErlNifRWLock *pread_lock)
  79. {
  80. this->pread_lock = pread_lock;
  81. enif_rwlock_rlock(this->pread_lock);
  82. };
  83. ~ReadLock()
  84. {
  85. enif_rwlock_runlock(pread_lock);
  86. };
  87. };
  88. // Class to handle Write lock
  89. class WriteLock
  90. {
  91. ErlNifRWLock *pwrite_lock;
  92. public:
  93. WriteLock(ErlNifRWLock *pwrite_lock)
  94. {
  95. this->pwrite_lock = pwrite_lock;
  96. enif_rwlock_rwlock(this->pwrite_lock);
  97. };
  98. ~WriteLock()
  99. {
  100. enif_rwlock_rwunlock(pwrite_lock);
  101. };
  102. };
  103. // Class to handle Mutex lock and unlock
  104. class Mutex
  105. {
  106. ErlNifMutex *pmtx;
  107. public:
  108. Mutex(ErlNifMutex *pmtx)
  109. {
  110. this->pmtx = pmtx;
  111. enif_mutex_lock(this->pmtx);
  112. };
  113. ~Mutex()
  114. {
  115. enif_mutex_unlock(pmtx);
  116. };
  117. };
  118. #endif /* ETSQ_H_ */