buffer.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. //
  2. // Created by #Suyghur, on 4/7/21.
  3. //
  4. #include "buffer.h"
  5. #include "../kit/common_log.h"
  6. Buffer::Buffer(char *ptr, size_t buffer_size) : buffer_ptr(ptr), buffer_size(buffer_size), buffer_header(buffer_ptr, buffer_size) {}
  7. Buffer::~Buffer() {
  8. Release();
  9. }
  10. void Buffer::InitData(char *log_path, size_t log_path_len, size_t limit_size, bool _compress) {
  11. std::lock_guard<std::recursive_mutex> lck_release(log_mtx);
  12. memset(buffer_ptr, '\0', buffer_size);
  13. dolin_common::Header header{};
  14. header.magic = kMagicHeader;
  15. header.log_path_len = log_path_len;
  16. header.log_path = log_path;
  17. header.log_len = 0;
  18. header.limit_size = limit_size;
  19. header.compress = _compress;
  20. buffer_header.InitHeader(header);
  21. InitCompress(_compress);
  22. data_ptr = (char *) buffer_header.GetDataPtr();
  23. write_ptr = (char *) buffer_header.GetWritePtr();
  24. OpenLogFile(log_path);
  25. }
  26. void Buffer::SetLength(size_t len) {
  27. buffer_header.SetLogLen(len);
  28. }
  29. size_t Buffer::GetLength() {
  30. return write_ptr - data_ptr;
  31. }
  32. size_t Buffer::Append(const char *log, size_t len) {
  33. std::lock_guard<std::recursive_mutex> lck_append(log_mtx);
  34. if (GetLength() == 0) {
  35. InitCompress(compress);
  36. }
  37. size_t free_size = EmptySize();
  38. size_t write_size;
  39. if (compress) {
  40. zStream.avail_in = (uInt) len;
  41. zStream.next_in = (Bytef *) log;
  42. zStream.avail_out = (uInt) free_size;
  43. zStream.next_out = (Bytef *) write_ptr;
  44. if (Z_OK != deflate(&zStream, Z_SYNC_FLUSH)) {
  45. return 0;
  46. }
  47. write_size = free_size - zStream.avail_out;
  48. } else {
  49. write_size = len <= free_size ? len : free_size;
  50. memcpy(write_ptr, log, write_size);
  51. }
  52. write_ptr += write_size;
  53. SetLength(GetLength());
  54. return write_size;
  55. }
  56. void Buffer::Release() {
  57. std::lock_guard<std::recursive_mutex> lck_release(log_mtx);
  58. if (compress && Z_NULL != zStream.state) {
  59. deflateEnd(&zStream);
  60. }
  61. if (map_buffer) {
  62. munmap(buffer_ptr, buffer_size);
  63. } else {
  64. delete[]buffer_ptr;
  65. }
  66. if (log_file_ptr != nullptr) {
  67. fclose(log_file_ptr);
  68. }
  69. }
  70. size_t Buffer::EmptySize() {
  71. return buffer_size - (write_ptr - buffer_ptr);
  72. }
  73. char *Buffer::GetLogPath() {
  74. return buffer_header.GetLogPath();
  75. }
  76. void Buffer::SetFileFlush(FileFlush *flush) {
  77. file_flush_ptr = flush;
  78. }
  79. void Buffer::CallFileFlush() {
  80. CallFileFlush(file_flush_ptr);
  81. }
  82. void Buffer::CallFileFlush(FileFlush *flush) {
  83. CallFileFlush(flush, nullptr);
  84. }
  85. void Buffer::CallFileFlush(FileFlush *flush, Buffer *buffer) {
  86. if (flush == nullptr) {
  87. if (buffer != nullptr) {
  88. delete buffer;
  89. }
  90. return;
  91. }
  92. std::lock_guard<std::recursive_mutex> lck_flush(log_mtx);
  93. if (GetLength() > 0) {
  94. if (compress && Z_NULL != zStream.state) {
  95. deflateEnd(&zStream);
  96. }
  97. auto *buffer_flush = new BufferFlush(log_file_ptr);
  98. buffer_flush->Write(data_ptr, GetLength());
  99. buffer_flush->ReleaseThiz(buffer);
  100. Clear();
  101. flush->AsyncFlush(buffer_flush);
  102. } else {
  103. delete buffer;
  104. }
  105. }
  106. void Buffer::ExpLogPath(char *path, size_t limit_size) {
  107. if (log_file_ptr != nullptr) {
  108. CallFileFlush();
  109. }
  110. InitData(path, strlen(path), limit_size, compress);
  111. }
  112. void Buffer::Clear() {
  113. std::lock_guard<std::recursive_mutex> lck_clear(log_mtx);
  114. write_ptr = data_ptr;
  115. memset(write_ptr, '\0', EmptySize());
  116. SetLength(GetLength());
  117. }
  118. bool Buffer::InitCompress(bool _compress) {
  119. compress = _compress;
  120. if (compress) {
  121. zStream.zalloc = Z_NULL;
  122. zStream.zfree = Z_NULL;
  123. zStream.opaque = Z_NULL;
  124. return Z_OK == deflateInit2(&zStream, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY);
  125. }
  126. return false;
  127. }
  128. bool Buffer::OpenLogFile(const char *path) {
  129. if (path != nullptr) {
  130. FILE *file = fopen(path, "ab+");
  131. if (file != nullptr) {
  132. log_file_ptr = file;
  133. return true;
  134. }
  135. }
  136. return false;
  137. }
  138. bool Buffer::IsCurrentLogFileOversize() {
  139. return GetCurrentLogFileSize() >= buffer_header.GetLimitSize();
  140. }
  141. size_t Buffer::GetCurrentLogFileSize() {
  142. size_t size = 0;
  143. if (log_file_ptr != nullptr) {
  144. fseek(log_file_ptr, 0, SEEK_END);
  145. size = ftell(log_file_ptr);
  146. }
  147. return size;
  148. }