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