mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 03:28:20 +02:00
MemLogger
This commit is contained in:
parent
96f8b1426d
commit
119da8dada
14 changed files with 377 additions and 34 deletions
|
@ -10,6 +10,7 @@
|
|||
#include "util/Vector.h"
|
||||
#include "util/PerfTimer.h"
|
||||
#include "util/TLSingleton.h"
|
||||
#include "util/MemLogger.h"
|
||||
#include "img/ImgEffects.h"
|
||||
|
||||
#include "util/AllocDebug.h"
|
||||
|
@ -926,4 +927,36 @@ BF_EXPORT void BF_CALLTYPE BF_Test()
|
|||
|
||||
for (int i : iArr)
|
||||
OutputDebugStrF("Hey %d\n", i);
|
||||
}
|
||||
}
|
||||
|
||||
BF_EXPORT void* BF_CALLTYPE MemLogger_Create(const char* memName, int size)
|
||||
{
|
||||
MemLogger* memLogger = new MemLogger();
|
||||
if (!memLogger->Create(memName, size))
|
||||
{
|
||||
delete memLogger;
|
||||
return NULL;
|
||||
}
|
||||
return memLogger;
|
||||
}
|
||||
|
||||
BF_EXPORT void BF_CALLTYPE MemLogger_Write(MemLogger* memLogger, void* ptr, int size)
|
||||
{
|
||||
memLogger->Write(ptr, size);
|
||||
}
|
||||
|
||||
BF_EXPORT void BF_CALLTYPE MemLogger_Delete(MemLogger* memLogger)
|
||||
{
|
||||
delete memLogger;
|
||||
}
|
||||
|
||||
BF_EXPORT const char* BF_CALLTYPE MemLogger_Get(const char* memName)
|
||||
{
|
||||
MemLogger memLogger;
|
||||
|
||||
String& outString = *gBeefySys_TLStrReturn.Get();
|
||||
outString.Clear();
|
||||
if (!memLogger.Get(memName, outString))
|
||||
return NULL;
|
||||
return outString.c_str();
|
||||
}
|
||||
|
|
|
@ -1950,6 +1950,7 @@ copy /y "$(OutDir)$(TargetName).lib" "$(SolutionDir)\BeefLibs\Beefy2D\dist\"</Co
|
|||
<ClCompile Include="util\MappedFile.cpp" />
|
||||
<ClCompile Include="util\MathUtils.cpp" />
|
||||
<ClCompile Include="util\Matrix4.cpp" />
|
||||
<ClCompile Include="util\MemLogger.cpp" />
|
||||
<ClCompile Include="util\MTRand.cpp" />
|
||||
<ClCompile Include="util\PerfTimer.cpp" />
|
||||
<ClCompile Include="util\Point.cpp" />
|
||||
|
@ -2189,6 +2190,7 @@ copy /y "$(OutDir)$(TargetName).lib" "$(SolutionDir)\BeefLibs\Beefy2D\dist\"</Co
|
|||
<ClInclude Include="util\MappedFile.h" />
|
||||
<ClInclude Include="util\MathUtils.h" />
|
||||
<ClInclude Include="util\Matrix4.h" />
|
||||
<ClInclude Include="util\MemLogger.h" />
|
||||
<ClInclude Include="util\MTRand.h" />
|
||||
<ClInclude Include="util\MultiDictionary.h" />
|
||||
<ClInclude Include="util\MultiHashSet.h" />
|
||||
|
|
|
@ -743,6 +743,9 @@
|
|||
<ClCompile Include="img\BMPData.cpp">
|
||||
<Filter>src\img</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="util\MemLogger.cpp">
|
||||
<Filter>src\util</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Common.h">
|
||||
|
@ -1147,6 +1150,9 @@
|
|||
<ClInclude Include="img\BMPData.h">
|
||||
<Filter>src\img</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="util\MemLogger.h">
|
||||
<Filter>src\util</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<CustomBuild Include="third_party\libffi\i686-pc-cygwin\src\x86\win32.asm">
|
||||
|
|
|
@ -880,6 +880,7 @@
|
|||
<ClCompile Include="util\Json.cpp" />
|
||||
<ClCompile Include="util\MappedFile.cpp" />
|
||||
<ClCompile Include="util\Matrix4.cpp" />
|
||||
<ClCompile Include="util\MemLogger.cpp" />
|
||||
<ClCompile Include="util\PerfTimer.cpp" />
|
||||
<ClCompile Include="util\Point.cpp" />
|
||||
<ClCompile Include="util\PolySpline.cpp" />
|
||||
|
@ -1047,6 +1048,7 @@
|
|||
<ClInclude Include="util\Json.h" />
|
||||
<ClInclude Include="util\MappedFile.h" />
|
||||
<ClInclude Include="util\Matrix4.h" />
|
||||
<ClInclude Include="util\MemLogger.h" />
|
||||
<ClInclude Include="util\PerfTimer.h" />
|
||||
<ClInclude Include="util\Point.h" />
|
||||
<ClInclude Include="util\PolySpline.h" />
|
||||
|
|
|
@ -593,6 +593,9 @@
|
|||
<ClCompile Include="img\BMPData.cpp">
|
||||
<Filter>src\img</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="util\MemLogger.cpp">
|
||||
<Filter>src\util</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Common.h">
|
||||
|
@ -913,6 +916,9 @@
|
|||
<ClInclude Include="img\BMPData.h">
|
||||
<Filter>src\img</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="util\MemLogger.h">
|
||||
<Filter>src\util</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<CustomBuild Include="third_party\libffi\i686-pc-cygwin\src\x86\win32.asm">
|
||||
|
|
|
@ -660,7 +660,7 @@ void Beefy::ExactMinimalDoubleToStr(double d, char* str)
|
|||
|
||||
static char* StbspCallback(char *buf, void *user, int len)
|
||||
{
|
||||
((String*)user)->Append(buf, len);
|
||||
((StringImpl*)user)->Append(buf, len);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
@ -821,6 +821,12 @@ String Beefy::vformat(const char* fmt, va_list argPtr)
|
|||
BF_stbsp_vsprintfcb(StbspCallback, (void*)&str, buf, fmt, argPtr);
|
||||
return str;
|
||||
}
|
||||
|
||||
void Beefy::vformat(StringImpl& str, const char* fmt, va_list argPtr)
|
||||
{
|
||||
char buf[STB_SPRINTF_MIN];
|
||||
BF_stbsp_vsprintfcb(StbspCallback, (void*)&str, buf, fmt, argPtr);
|
||||
}
|
||||
#endif
|
||||
|
||||
String Beefy::StrFormat(const char* fmt ...)
|
||||
|
|
|
@ -195,6 +195,7 @@ uint64 BFGetTickCountMicro();
|
|||
uint64 BFGetTickCountMicroFast();
|
||||
|
||||
extern String vformat(const char* fmt, va_list argPtr);
|
||||
extern void vformat(StringImpl& str, const char* fmt, va_list argPtr);
|
||||
extern String StrFormat(const char* fmt ...);
|
||||
void ExactMinimalFloatToStr(float f, char* str);
|
||||
void ExactMinimalDoubleToStr(double d, char* str);
|
||||
|
|
161
BeefySysLib/util/MemLogger.cpp
Normal file
161
BeefySysLib/util/MemLogger.cpp
Normal file
|
@ -0,0 +1,161 @@
|
|||
#include "MemLogger.h"
|
||||
|
||||
USING_NS_BF;
|
||||
|
||||
struct MemLogger_Header
|
||||
{
|
||||
public:
|
||||
int mHead;
|
||||
int mTail;
|
||||
int mSize;
|
||||
};
|
||||
|
||||
MemLogger::MemLogger()
|
||||
{
|
||||
mFileMap = NULL;
|
||||
mMemBuffer = NULL;
|
||||
mBufferSize = 0;
|
||||
mTotalWriteSize = 0;
|
||||
}
|
||||
|
||||
MemLogger::~MemLogger()
|
||||
{
|
||||
if (mMemBuffer != NULL)
|
||||
::UnmapViewOfFile(mMemBuffer);
|
||||
if (mFileMap != NULL)
|
||||
::CloseHandle(mFileMap);
|
||||
}
|
||||
|
||||
void MemLogger::Write(const void* ptr, int size)
|
||||
{
|
||||
if (mMemBuffer == NULL)
|
||||
return;
|
||||
if (size == 0)
|
||||
return;
|
||||
|
||||
int dataSize = mBufferSize - sizeof(MemLogger_Header);
|
||||
void* dataPtr = (uint8*)mMemBuffer + sizeof(MemLogger_Header);
|
||||
|
||||
MemLogger_Header* header = (MemLogger_Header*)mMemBuffer;
|
||||
|
||||
bool wasWrapped = header->mHead < header->mTail;
|
||||
|
||||
int writeSize = BF_MIN(size, dataSize - header->mHead);
|
||||
memcpy((char*)dataPtr + header->mHead, ptr, writeSize);
|
||||
size -= writeSize;
|
||||
|
||||
header->mHead += writeSize;
|
||||
while (header->mHead >= dataSize)
|
||||
header->mHead -= dataSize;
|
||||
|
||||
if (size > 0)
|
||||
{
|
||||
int writeSize2 = BF_MIN(size, dataSize - header->mHead);
|
||||
memcpy((char*)dataPtr + header->mHead, (char*)ptr + writeSize, writeSize2);
|
||||
header->mHead += writeSize2;
|
||||
while (header->mHead >= dataSize)
|
||||
header->mHead -= dataSize;
|
||||
}
|
||||
|
||||
mTotalWriteSize += writeSize;
|
||||
|
||||
if (mTotalWriteSize >= dataSize)
|
||||
{
|
||||
header->mTail = header->mHead + 1;
|
||||
if (header->mTail > dataSize)
|
||||
header->mTail -= dataSize;
|
||||
}
|
||||
}
|
||||
|
||||
bool Beefy::MemLogger::Create(const StringImpl& memName, int size)
|
||||
{
|
||||
String sharedName = "MemLogger_" + memName;
|
||||
HANDLE hMapFile = CreateFileMappingA(
|
||||
INVALID_HANDLE_VALUE, // use paging file
|
||||
NULL, // default security
|
||||
PAGE_READWRITE, // read/write access
|
||||
0, // maximum object size (high-order DWORD)
|
||||
size, // maximum object size (low-order DWORD)
|
||||
sharedName.c_str()); // name of mapping object
|
||||
|
||||
if (hMapFile == NULL)
|
||||
return false;
|
||||
|
||||
mMemBuffer = MapViewOfFile(hMapFile, // handle to map object
|
||||
FILE_MAP_ALL_ACCESS, // read/write permission
|
||||
0,
|
||||
0,
|
||||
size);
|
||||
|
||||
if (mMemBuffer == NULL)
|
||||
return false;
|
||||
|
||||
mBufferSize = size;
|
||||
|
||||
MemLogger_Header* header = (MemLogger_Header*)mMemBuffer;
|
||||
header->mHead = 0;
|
||||
header->mTail = 0;
|
||||
header->mSize = size;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Beefy::MemLogger::Get(const StringImpl& memName, String& outStr)
|
||||
{
|
||||
String sharedName = "MemLogger_" + memName;
|
||||
HANDLE hMapFile = ::OpenFileMappingA(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, sharedName.c_str());
|
||||
if (hMapFile == NULL)
|
||||
return false;
|
||||
|
||||
void* memPtr = MapViewOfFile(hMapFile, // handle to map object
|
||||
FILE_MAP_ALL_ACCESS, // read/write permission
|
||||
0,
|
||||
0,
|
||||
sizeof(MemLogger_Header));
|
||||
|
||||
MemLogger_Header* header = (MemLogger_Header*)(memPtr);
|
||||
int size = header->mSize;
|
||||
UnmapViewOfFile(memPtr);
|
||||
|
||||
memPtr = MapViewOfFile(hMapFile, // handle to map object
|
||||
FILE_MAP_ALL_ACCESS, // read/write permission
|
||||
0,
|
||||
0,
|
||||
size);
|
||||
|
||||
if (memPtr == NULL)
|
||||
return false;
|
||||
|
||||
::CloseHandle(hMapFile);
|
||||
|
||||
header = (MemLogger_Header*)(memPtr);
|
||||
|
||||
int dataSize = header->mSize - sizeof(MemLogger_Header);
|
||||
void* dataPtr = (uint8*)memPtr + sizeof(MemLogger_Header);
|
||||
|
||||
if (header->mHead >= header->mTail)
|
||||
{
|
||||
// Not wrapped around
|
||||
outStr.Insert(outStr.mLength, (char*)dataPtr + header->mTail, header->mHead - header->mTail);
|
||||
}
|
||||
else
|
||||
{
|
||||
outStr.Insert(outStr.mLength, (char*)dataPtr + header->mTail, dataSize - header->mTail);
|
||||
outStr.Insert(outStr.mLength, (char*)dataPtr, header->mHead);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Beefy::MemLogger::Log(const char* fmt ...)
|
||||
{
|
||||
if (mMemBuffer == NULL)
|
||||
return;
|
||||
|
||||
StringT<4096> str;
|
||||
va_list argList;
|
||||
va_start(argList, fmt);
|
||||
vformat(str, fmt, argList);
|
||||
va_end(argList);
|
||||
|
||||
Write(str.c_str(), str.mLength);
|
||||
}
|
28
BeefySysLib/util/MemLogger.h
Normal file
28
BeefySysLib/util/MemLogger.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
#pragma once
|
||||
|
||||
#include "../Common.h"
|
||||
|
||||
NS_BF_BEGIN
|
||||
|
||||
class MemLogger
|
||||
{
|
||||
public:
|
||||
HANDLE mFileMap;
|
||||
void* mMemBuffer;
|
||||
int mBufferSize;
|
||||
int mTotalWriteSize;
|
||||
|
||||
public:
|
||||
MemLogger();
|
||||
|
||||
~MemLogger();
|
||||
|
||||
bool Create(const StringImpl& memName, int size);
|
||||
bool Get(const StringImpl& memName, String& outStr);
|
||||
void Log(const char* fmt ...);
|
||||
void Write(const void* ptr, int size);
|
||||
};
|
||||
|
||||
|
||||
|
||||
NS_BF_END
|
Loading…
Add table
Add a link
Reference in a new issue