MemLogger.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include "MemLogger.h"
  2. USING_NS_BF;
  3. struct MemLogger_Header
  4. {
  5. public:
  6. int mHead;
  7. int mTail;
  8. int mSize;
  9. };
  10. MemLogger::MemLogger()
  11. {
  12. mFileMap = NULL;
  13. mMemBuffer = NULL;
  14. mBufferSize = 0;
  15. mTotalWriteSize = 0;
  16. }
  17. MemLogger::~MemLogger()
  18. {
  19. if (mMemBuffer != NULL)
  20. ::UnmapViewOfFile(mMemBuffer);
  21. if (mFileMap != NULL)
  22. ::CloseHandle(mFileMap);
  23. }
  24. void MemLogger::Write(const void* ptr, int size)
  25. {
  26. if (mMemBuffer == NULL)
  27. return;
  28. if (size == 0)
  29. return;
  30. int dataSize = mBufferSize - sizeof(MemLogger_Header);
  31. void* dataPtr = (uint8*)mMemBuffer + sizeof(MemLogger_Header);
  32. MemLogger_Header* header = (MemLogger_Header*)mMemBuffer;
  33. bool wasWrapped = header->mHead < header->mTail;
  34. int writeSize = BF_MIN(size, dataSize - header->mHead);
  35. memcpy((char*)dataPtr + header->mHead, ptr, writeSize);
  36. size -= writeSize;
  37. header->mHead += writeSize;
  38. while (header->mHead >= dataSize)
  39. header->mHead -= dataSize;
  40. if (size > 0)
  41. {
  42. int writeSize2 = BF_MIN(size, dataSize - header->mHead);
  43. memcpy((char*)dataPtr + header->mHead, (char*)ptr + writeSize, writeSize2);
  44. header->mHead += writeSize2;
  45. while (header->mHead >= dataSize)
  46. header->mHead -= dataSize;
  47. }
  48. mTotalWriteSize += writeSize;
  49. if (mTotalWriteSize >= dataSize)
  50. {
  51. header->mTail = header->mHead + 1;
  52. if (header->mTail > dataSize)
  53. header->mTail -= dataSize;
  54. }
  55. }
  56. bool Beefy::MemLogger::Create(const StringImpl& memName, int size)
  57. {
  58. String sharedName = "MemLogger_" + memName;
  59. HANDLE hMapFile = CreateFileMappingA(
  60. INVALID_HANDLE_VALUE, // use paging file
  61. NULL, // default security
  62. PAGE_READWRITE, // read/write access
  63. 0, // maximum object size (high-order DWORD)
  64. size, // maximum object size (low-order DWORD)
  65. sharedName.c_str()); // name of mapping object
  66. if (hMapFile == NULL)
  67. return false;
  68. mMemBuffer = MapViewOfFile(hMapFile, // handle to map object
  69. FILE_MAP_ALL_ACCESS, // read/write permission
  70. 0,
  71. 0,
  72. size);
  73. if (mMemBuffer == NULL)
  74. return false;
  75. mBufferSize = size;
  76. MemLogger_Header* header = (MemLogger_Header*)mMemBuffer;
  77. header->mHead = 0;
  78. header->mTail = 0;
  79. header->mSize = size;
  80. return true;
  81. }
  82. bool Beefy::MemLogger::Get(const StringImpl& memName, String& outStr)
  83. {
  84. String sharedName = "MemLogger_" + memName;
  85. HANDLE hMapFile = ::OpenFileMappingA(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, sharedName.c_str());
  86. if (hMapFile == NULL)
  87. return false;
  88. void* memPtr = MapViewOfFile(hMapFile, // handle to map object
  89. FILE_MAP_ALL_ACCESS, // read/write permission
  90. 0,
  91. 0,
  92. sizeof(MemLogger_Header));
  93. MemLogger_Header* header = (MemLogger_Header*)(memPtr);
  94. int size = header->mSize;
  95. UnmapViewOfFile(memPtr);
  96. memPtr = MapViewOfFile(hMapFile, // handle to map object
  97. FILE_MAP_ALL_ACCESS, // read/write permission
  98. 0,
  99. 0,
  100. size);
  101. if (memPtr == NULL)
  102. return false;
  103. ::CloseHandle(hMapFile);
  104. header = (MemLogger_Header*)(memPtr);
  105. int dataSize = header->mSize - sizeof(MemLogger_Header);
  106. void* dataPtr = (uint8*)memPtr + sizeof(MemLogger_Header);
  107. if (header->mHead >= header->mTail)
  108. {
  109. // Not wrapped around
  110. outStr.Insert(outStr.mLength, (char*)dataPtr + header->mTail, header->mHead - header->mTail);
  111. }
  112. else
  113. {
  114. outStr.Insert(outStr.mLength, (char*)dataPtr + header->mTail, dataSize - header->mTail);
  115. outStr.Insert(outStr.mLength, (char*)dataPtr, header->mHead);
  116. }
  117. return true;
  118. }
  119. void Beefy::MemLogger::Log(const char* fmt ...)
  120. {
  121. if (mMemBuffer == NULL)
  122. return;
  123. StringT<4096> str;
  124. va_list argList;
  125. va_start(argList, fmt);
  126. vformat(str, fmt, argList);
  127. va_end(argList);
  128. Write(str.c_str(), str.mLength);
  129. }