buffer.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. //
  2. // Created by #Suyghur, on 4/7/21.
  3. //
  4. #include "buffer.h"
  5. Buffer::Buffer(char *ptr, size_t buffer_size) : buffer_ptr(ptr), buffer_size(buffer_size), buffer_header(buffer_ptr, buffer_size) {}
  6. Buffer::~Buffer() {
  7. release();
  8. }
  9. void Buffer::initData(char *log_path, size_t log_path_len, bool compress) {
  10. std::lock_guard<std::recursive_mutex> lck_release(log_mtx);
  11. memset(buffer_ptr, '\0', buffer_size);
  12. buffer_header::Header header{};
  13. header.magic = kMagicHeader;
  14. header.log_path_len = log_path_len;
  15. header.log_path = log_path;
  16. header.log_len = 0;
  17. header.compress = compress;
  18. buffer_header.initHeader(header);
  19. initCompress(compress);
  20. data_ptr = (char *) buffer_header.getPtr();
  21. write_ptr = (char *) buffer_header.getWritePtr();
  22. openLogFile(log_path);
  23. }
  24. void Buffer::setLength(size_t len) {
  25. buffer_header.setLogLen(len);
  26. }
  27. size_t Buffer::getLength() {
  28. return write_ptr - data_ptr;
  29. }
  30. size_t Buffer::append(const char *log, size_t len) {
  31. std::lock_guard<std::recursive_mutex> lck_append(log_mtx);
  32. if (getLength() == 0) {
  33. initCompress(compress);
  34. }
  35. size_t free_size = emptySize();
  36. size_t write_size;
  37. if (compress) {
  38. zStream.avail_in = (uInt) len;
  39. zStream.next_in = (Bytef *) log;
  40. zStream.avail_out = (uInt) free_size;
  41. zStream.next_out = (Bytef *) write_ptr;
  42. if (Z_OK != deflate(&zStream, Z_SYNC_FLUSH)) {
  43. return 0;
  44. }
  45. write_size = free_size - zStream.avail_out;
  46. } else {
  47. write_size = len <= free_size ? len : free_size;
  48. memcpy(write_ptr, log, write_size);
  49. }
  50. write_ptr += write_size;
  51. setLength(getLength());
  52. return write_size;
  53. }
  54. void Buffer::release() {
  55. std::lock_guard<std::recursive_mutex> lck_release(log_mtx);
  56. if (compress && Z_NULL != zStream.state) {
  57. deflateEnd(&zStream);
  58. }
  59. if (map_buffer) {
  60. munmap(buffer_ptr, buffer_size);
  61. } else {
  62. delete[]buffer_ptr;
  63. }
  64. if (log_file_ptr != nullptr) {
  65. fclose(log_file_ptr);
  66. }
  67. }
  68. size_t Buffer::emptySize() {
  69. return buffer_size - (write_ptr - buffer_ptr);
  70. }
  71. char *Buffer::getLogPath() {
  72. return buffer_header.getLogPath();
  73. }
  74. void Buffer::setFileFlush(FileFlush *flush) {
  75. file_flush_ptr = flush;
  76. }
  77. void Buffer::callFileFlush() {
  78. callFileFlush(file_flush_ptr);
  79. }
  80. void Buffer::callFileFlush(FileFlush *flush) {
  81. callFileFlush(file_flush_ptr, nullptr);
  82. }
  83. void Buffer::callFileFlush(FileFlush *flush, Buffer *buffer) {
  84. if (flush == nullptr) {
  85. if (buffer != nullptr) {
  86. delete buffer;
  87. }
  88. return;
  89. }
  90. std::lock_guard<std::recursive_mutex> lck_flush(log_mtx);
  91. if (getLength() > 0) {
  92. if (compress && Z_NULL != zStream.state) {
  93. deflateEnd(&zStream);
  94. }
  95. auto *buffer_flush = new BufferFlush(log_file_ptr);
  96. buffer_flush->write(data_ptr, getLength());
  97. buffer_flush->releaseThiz(buffer);
  98. clear();
  99. flush->asyncFlush(buffer_flush);
  100. } else {
  101. delete buffer;
  102. }
  103. }
  104. void Buffer::changeLogPath(char *path) {
  105. if (log_file_ptr != nullptr) {
  106. callFileFlush();
  107. }
  108. initData(path, strlen(path), compress);
  109. }
  110. void Buffer::clear() {
  111. std::lock_guard<std::recursive_mutex> lck_clear(log_mtx);
  112. write_ptr = data_ptr;
  113. memset(write_ptr, '\0', emptySize());
  114. setLength(getLength());
  115. }
  116. bool Buffer::initCompress(bool is_compress) {
  117. compress = is_compress;
  118. if (compress) {
  119. zStream.zalloc = Z_NULL;
  120. zStream.zfree = Z_NULL;
  121. zStream.opaque = Z_NULL;
  122. return Z_OK == deflateInit2(&zStream, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY);
  123. }
  124. return false;
  125. }
  126. bool Buffer::openLogFile(const char *path) {
  127. if (path != nullptr) {
  128. FILE *file = fopen(path, "ab+");
  129. if (file != nullptr) {
  130. log_file_ptr = file;
  131. return true;
  132. }
  133. }
  134. return false;
  135. }