log_queue.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "log_queue.h"
  2. #include "log_multi_thread.h"
  3. struct _log_queue{
  4. void ** data;
  5. int64_t head;
  6. int64_t tail;
  7. int32_t size;
  8. CRITICALSECTION mutex;
  9. COND notempty;
  10. };
  11. log_queue * log_queue_create(int32_t size)
  12. {
  13. log_queue* queue;
  14. void * buffer = malloc(sizeof(void *) * size + sizeof(log_queue));
  15. memset(buffer, 0, sizeof(void *) * size + sizeof(log_queue));
  16. queue = (log_queue *)buffer;
  17. queue->data = (void **)((char*)buffer + sizeof(log_queue));
  18. queue->size = size;
  19. queue->mutex = CreateCriticalSection();
  20. queue->notempty = CreateCond();
  21. return queue;
  22. }
  23. void log_queue_destroy(log_queue * queue)
  24. {
  25. ReleaseCriticalSection(queue->mutex);
  26. DeleteCond(queue->notempty);
  27. free(queue);
  28. }
  29. int32_t log_queue_size(log_queue * queue)
  30. {
  31. int32_t len;
  32. CS_ENTER(queue->mutex);
  33. len = queue->tail - queue->head;
  34. CS_LEAVE(queue->mutex);
  35. return len;
  36. }
  37. int32_t log_queue_isfull(log_queue * queue)
  38. {
  39. int32_t rst;
  40. CS_ENTER(queue->mutex);
  41. rst = (int32_t)((queue->tail - queue->head) == queue->size);
  42. CS_LEAVE(queue->mutex);
  43. return rst;
  44. }
  45. int32_t log_queue_push(log_queue * queue, void * data)
  46. {
  47. CS_ENTER(queue->mutex);
  48. if (queue->tail - queue->head == queue->size)
  49. {
  50. CS_LEAVE(queue->mutex);
  51. return -1;
  52. }
  53. queue->data[queue->tail++ % queue->size] = data;
  54. CS_LEAVE(queue->mutex);
  55. COND_SIGNAL(queue->notempty);
  56. return 0;
  57. }
  58. void * log_queue_pop(log_queue * queue, int32_t waitMs) {
  59. void* result = NULL;
  60. CS_ENTER(queue->mutex);
  61. if (queue->tail == queue->head) {
  62. COND_WAIT_TIME(queue->notempty, queue->mutex, waitMs);
  63. }
  64. if (queue->tail > queue->head)
  65. {
  66. result = queue->data[queue->head++ % queue->size];
  67. }
  68. CS_LEAVE(queue->mutex);
  69. return result;
  70. }
  71. void * log_queue_trypop(log_queue * queue)
  72. {
  73. void* result = NULL;
  74. CS_ENTER(queue->mutex);
  75. if (queue->tail > queue->head)
  76. {
  77. result = queue->data[queue->head++ % queue->size];
  78. }
  79. CS_LEAVE(queue->mutex);
  80. return result;
  81. }