Allocator refactor

This commit is contained in:
elasota
2021-04-28 01:46:07 -04:00
parent 472462c535
commit a2d374f650
75 changed files with 473 additions and 253 deletions

View File

@@ -43,6 +43,7 @@
<Import Project="..\GpMainApp.props" />
<Import Project="..\GpShell.props" />
<Import Project="..\Debug.props" />
<Import Project="..\AerofoilPortable.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
@@ -52,6 +53,7 @@
<Import Project="..\GpMainApp.props" />
<Import Project="..\Release.props" />
<Import Project="..\GpShell.props" />
<Import Project="..\AerofoilPortable.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
@@ -82,6 +84,7 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\AerofoilPortable\GpAllocator_C.cpp" />
<ClCompile Include="GpBWCursor_Win32.cpp" />
<ClCompile Include="GpColorCursor_Win32.cpp" />
<ClCompile Include="GpFileStream_Win32.cpp" />

View File

@@ -28,6 +28,9 @@
<ClCompile Include="GpBWCursor_Win32.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\AerofoilPortable\GpAllocator_C.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\GpCommon\EGpInputDriverType.h">

View File

@@ -21,6 +21,7 @@
#include "GpBWCursor_Win32.h"
#include "GpWindows.h"
#include "IGpAllocator.h"
#include <stdint.h>
#include <stdlib.h>
@@ -34,19 +35,19 @@ void GpBWCursor_Win32::Destroy()
this->DecRef();
}
IGpCursor_Win32 *GpBWCursor_Win32::Create(size_t width, size_t height, const void *pixelData, const void *maskData, size_t hotSpotX, size_t hotSpotY)
IGpCursor_Win32 *GpBWCursor_Win32::Create(IGpAllocator *alloc, size_t width, size_t height, const void *pixelData, const void *maskData, size_t hotSpotX, size_t hotSpotY)
{
size_t numBits = width * height;
size_t numBytes = (width * height + 7) / 8;
uint8_t *convertedAndData = static_cast<uint8_t*>(malloc(numBytes));
uint8_t *convertedXorData = static_cast<uint8_t*>(malloc(numBytes));
size_t numBytes = (numBits + 7) / 8;
uint8_t *convertedAndData = static_cast<uint8_t*>(alloc->Alloc(numBytes));
uint8_t *convertedXorData = static_cast<uint8_t*>(alloc->Alloc(numBytes));
if (!convertedAndData || !convertedXorData)
{
if (convertedAndData)
free(convertedAndData);
alloc->Release(convertedAndData);
if (convertedXorData)
free(convertedXorData);
alloc->Release(convertedXorData);
return nullptr;
}
@@ -62,25 +63,26 @@ IGpCursor_Win32 *GpBWCursor_Win32::Create(size_t width, size_t height, const voi
HCURSOR hcursor = CreateCursor(g_gpWindowsGlobals.m_hInstance, static_cast<int>(hotSpotX), static_cast<int>(hotSpotY), static_cast<int>(width), static_cast<int>(height), convertedAndData, convertedXorData);
free(convertedAndData);
free(convertedXorData);
alloc->Release(convertedAndData);
alloc->Release(convertedXorData);
if (!hcursor)
return nullptr;
void *storage = malloc(sizeof(GpBWCursor_Win32));
void *storage = alloc->Alloc(sizeof(GpBWCursor_Win32));
if (!storage)
{
DestroyCursor(hcursor);
return nullptr;
}
return new (storage) GpBWCursor_Win32(hcursor);
return new (storage) GpBWCursor_Win32(hcursor, alloc);
}
GpBWCursor_Win32::GpBWCursor_Win32(HCURSOR cursor)
GpBWCursor_Win32::GpBWCursor_Win32(HCURSOR cursor, IGpAllocator *alloc)
: m_cursor(cursor)
, m_refCount(1)
, m_alloc(alloc)
{
}
@@ -104,7 +106,8 @@ void GpBWCursor_Win32::DecRef()
m_refCount--;
if (m_refCount == 0)
{
IGpAllocator *alloc = m_alloc;
this->~GpBWCursor_Win32();
free(this);
alloc->Release(this);
}
}

View File

@@ -3,6 +3,8 @@
#include "IGpCursor_Win32.h"
#include "GpWindows.h"
struct IGpAllocator;
class GpBWCursor_Win32 final : public IGpCursor_Win32
{
public:
@@ -13,12 +15,13 @@ public:
void IncRef() override;
void DecRef() override;
static IGpCursor_Win32 *Create(size_t width, size_t height, const void *pixelData, const void *maskData, size_t hotSpotX, size_t hotSpotY);
static IGpCursor_Win32 *Create(IGpAllocator *alloc, size_t width, size_t height, const void *pixelData, const void *maskData, size_t hotSpotX, size_t hotSpotY);
private:
GpBWCursor_Win32(HCURSOR cursor);
GpBWCursor_Win32(HCURSOR cursor, IGpAllocator *alloc);
~GpBWCursor_Win32();
HCURSOR m_cursor;
int m_refCount;
IGpAllocator *m_alloc;
};

View File

@@ -20,6 +20,7 @@
*/
#include "GpColorCursor_Win32.h"
#include "IGpAllocator.h"
#include <stdint.h>
#include <stdlib.h>
@@ -31,7 +32,7 @@ void GpColorCursor_Win32::Destroy()
this->DecRef();
}
IGpCursor_Win32 *GpColorCursor_Win32::Create(size_t width, size_t height, const void *pixelDataRGBA, size_t hotSpotX, size_t hotSpotY)
IGpCursor_Win32 *GpColorCursor_Win32::Create(IGpAllocator *alloc, size_t width, size_t height, const void *pixelDataRGBA, size_t hotSpotX, size_t hotSpotY)
{
const size_t paddingBits = (sizeof(void*) * 8);
@@ -52,7 +53,7 @@ IGpCursor_Win32 *GpColorCursor_Win32::Create(size_t width, size_t height, const
size_t maskPitch = width + paddingBits - 1;
maskPitch -= maskPitch % paddingBits;
LPVOID maskBits = malloc(maskPitch * height);
LPVOID maskBits = alloc->Alloc(maskPitch * height);
if (!maskBits)
return nullptr;
@@ -71,6 +72,8 @@ IGpCursor_Win32 *GpColorCursor_Win32::Create(size_t width, size_t height, const
ii.hbmMask = CreateBitmap(width, height, 1, 1, maskBits);
ReleaseDC(NULL, hdc);
alloc->Release(maskBits);
size_t cursorPitch = width * 4;
size_t numPixels = width * height;
@@ -90,19 +93,20 @@ IGpCursor_Win32 *GpColorCursor_Win32::Create(size_t width, size_t height, const
if (!hicon)
return nullptr;
void *storage = malloc(sizeof(GpColorCursor_Win32));
void *storage = alloc->Alloc(sizeof(GpColorCursor_Win32));
if (!storage)
{
DestroyIcon(hicon);
return nullptr;
}
return new (storage) GpColorCursor_Win32(reinterpret_cast<HCURSOR>(hicon));
return new (storage) GpColorCursor_Win32(alloc, reinterpret_cast<HCURSOR>(hicon));
}
GpColorCursor_Win32::GpColorCursor_Win32(HCURSOR cursor)
GpColorCursor_Win32::GpColorCursor_Win32(IGpAllocator *alloc, HCURSOR cursor)
: m_cursor(cursor)
, m_refCount(1)
, m_alloc(alloc)
{
}
@@ -126,7 +130,8 @@ void GpColorCursor_Win32::DecRef()
m_refCount--;
if (m_refCount == 0)
{
IGpAllocator *alloc = m_alloc;
this->~GpColorCursor_Win32();
free(this);
alloc->Release(this);
}
}

View File

@@ -3,6 +3,7 @@
#include "IGpCursor_Win32.h"
#include "GpWindows.h"
struct IGpAllocator;
class GpColorCursor_Win32 final : public IGpCursor_Win32
{
@@ -14,12 +15,13 @@ public:
void IncRef() override;
void DecRef() override;
static IGpCursor_Win32 *Create(size_t width, size_t height, const void *pixelDataRGBA, size_t hotSpotX, size_t hotSpotY);
static IGpCursor_Win32 *Create(IGpAllocator *alloc, size_t width, size_t height, const void *pixelDataRGBA, size_t hotSpotX, size_t hotSpotY);
private:
GpColorCursor_Win32(HCURSOR cursor);
GpColorCursor_Win32(IGpAllocator *alloc, HCURSOR cursor);
~GpColorCursor_Win32();
HCURSOR m_cursor;
int m_refCount;
IGpAllocator *m_alloc;
};

View File

@@ -1,8 +1,10 @@
#include "GpFileSystem_Win32.h"
#include "GpAllocator_C.h"
#include "GpApplicationName.h"
#include "GpFileStream_Win32.h"
#include "GpWindows.h"
#include "IGpAllocator.h"
#include "IGpDirectoryCursor.h"
#include <string>
@@ -12,33 +14,36 @@
#include <assert.h>
struct IGpAllocator;
extern GpWindowsGlobals g_gpWindowsGlobals;
class GpDirectoryCursor_Win32 final : public IGpDirectoryCursor
{
public:
static GpDirectoryCursor_Win32 *Create(const HANDLE &handle, const WIN32_FIND_DATAW &findData);
static GpDirectoryCursor_Win32 *Create(IGpAllocator *alloc, const HANDLE &handle, const WIN32_FIND_DATAW &findData);
bool GetNext(const char *&outFileName) override;
void Destroy() override;
private:
GpDirectoryCursor_Win32(const HANDLE &handle, const WIN32_FIND_DATAW &findData);
GpDirectoryCursor_Win32(IGpAllocator *alloc, const HANDLE &handle, const WIN32_FIND_DATAW &findData);
~GpDirectoryCursor_Win32();
IGpAllocator *m_alloc;
HANDLE m_handle;
WIN32_FIND_DATAW m_findData;
char m_chars[MAX_PATH + 1];
bool m_haveNext;
};
GpDirectoryCursor_Win32 *GpDirectoryCursor_Win32::Create(const HANDLE &handle, const WIN32_FIND_DATAW &findData)
GpDirectoryCursor_Win32 *GpDirectoryCursor_Win32::Create(IGpAllocator *alloc, const HANDLE &handle, const WIN32_FIND_DATAW &findData)
{
void *storage = malloc(sizeof(GpDirectoryCursor_Win32));
void *storage = alloc->Alloc(sizeof(GpDirectoryCursor_Win32));
if (!storage)
return nullptr;
return new (storage) GpDirectoryCursor_Win32(handle, findData);
return new (storage) GpDirectoryCursor_Win32(alloc, handle, findData);
}
bool GpDirectoryCursor_Win32::GetNext(const char *&outFileName)
@@ -82,14 +87,16 @@ bool GpDirectoryCursor_Win32::GetNext(const char *&outFileName)
void GpDirectoryCursor_Win32::Destroy()
{
IGpAllocator *alloc = m_alloc;
this->~GpDirectoryCursor_Win32();
free(this);
alloc->Release(this);
}
GpDirectoryCursor_Win32::GpDirectoryCursor_Win32(const HANDLE &handle, const WIN32_FIND_DATAW &findData)
GpDirectoryCursor_Win32::GpDirectoryCursor_Win32(IGpAllocator *alloc, const HANDLE &handle, const WIN32_FIND_DATAW &findData)
: m_handle(handle)
, m_findData(findData)
, m_haveNext(true)
, m_alloc(alloc)
{
}
@@ -99,6 +106,7 @@ GpDirectoryCursor_Win32::~GpDirectoryCursor_Win32()
}
GpFileSystem_Win32::GpFileSystem_Win32()
: m_alloc(GpAllocator_C::GetInstance())
{
// GP TODO: This shouldn't be static init since it allocates memory
m_executablePath[0] = 0;
@@ -277,7 +285,7 @@ IGpDirectoryCursor *GpFileSystem_Win32::ScanDirectoryNested(PortabilityLayer::Vi
{
wchar_t winPath[MAX_PATH + 2];
const char **expandedPaths = static_cast<const char**>(malloc(sizeof(const char*) * (numPaths + 1)));
const char **expandedPaths = static_cast<const char**>(m_alloc->Alloc(sizeof(const char*) * (numPaths + 1)));
if (!expandedPaths)
return nullptr;
@@ -286,7 +294,7 @@ IGpDirectoryCursor *GpFileSystem_Win32::ScanDirectoryNested(PortabilityLayer::Vi
expandedPaths[numPaths] = "*";
const bool isPathResolved = ResolvePath(virtualDirectory, expandedPaths, numPaths + 1, winPath);
free(expandedPaths);
m_alloc->Release(expandedPaths);
if (!isPathResolved)
return nullptr;
@@ -297,7 +305,7 @@ IGpDirectoryCursor *GpFileSystem_Win32::ScanDirectoryNested(PortabilityLayer::Vi
if (ff == INVALID_HANDLE_VALUE)
return nullptr;
return GpDirectoryCursor_Win32::Create(ff, findData);
return GpDirectoryCursor_Win32::Create(m_alloc, ff, findData);
}
bool GpFileSystem_Win32::ValidateFilePathUnicodeChar(uint32_t c) const

View File

@@ -41,5 +41,7 @@ private:
std::wstring m_fontCacheDir;
wchar_t m_executablePath[MAX_PATH];
IGpAllocator *m_alloc;
static GpFileSystem_Win32 ms_instance;
};

View File

@@ -1,3 +1,4 @@
#include "GpAllocator_C.h"
#include "GpLogDriver_Win32.h"
#include "GpFileSystem_Win32.h"
@@ -7,6 +8,7 @@
GpLogDriver_Win32::GpLogDriver_Win32()
: m_stream(nullptr)
, m_isInitialized(false)
, m_alloc(GpAllocator_C::GetInstance())
{
}
@@ -58,14 +60,14 @@ void GpLogDriver_Win32::VPrintf(Category category, const char *fmt, va_list args
if (formattedSize <= 0)
return;
char *charBuff = static_cast<char*>(malloc(formattedSize + 1));
char *charBuff = static_cast<char*>(m_alloc->Alloc(formattedSize + 1));
if (!charBuff)
return;
vsnprintf(charBuff, formattedSize + 1, fmt, args);
m_stream->Write(charBuff, formattedSize);
free(charBuff);
m_alloc->Release(charBuff);
}
m_stream->Write("\n", 1);

View File

@@ -3,6 +3,7 @@
#include "IGpLogDriver.h"
class GpIOStream;
struct IGpAllocator;
class GpLogDriver_Win32 : public IGpLogDriver
{
@@ -20,6 +21,7 @@ private:
void InitInternal();
GpIOStream *m_stream;
IGpAllocator *m_alloc;
bool m_isInitialized;
static GpLogDriver_Win32 ms_instance;

View File

@@ -1,4 +1,5 @@
#include "GpMain.h"
#include "GpAllocator_C.h"
#include "GpAudioDriverFactory.h"
#include "GpBWCursor_Win32.h"
#include "GpColorCursor_Win32.h"
@@ -410,12 +411,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
}
IGpLogDriver *logger = GpLogDriver_Win32::GetInstance();
IGpAllocator *alloc = GpAllocator_C::GetInstance();
IGpSystemServices *sysServices = GpSystemServices_Win32::GetInstance();
GpDriverCollection *drivers = GpAppInterface_Get()->PL_GetDriverCollection();
drivers->SetDriver<GpDriverIDs::kFileSystem>(GpFileSystem_Win32::GetInstance());
drivers->SetDriver<GpDriverIDs::kSystemServices>(GpSystemServices_Win32::GetInstance());
drivers->SetDriver<GpDriverIDs::kLog>(GpLogDriver_Win32::GetInstance());
drivers->SetDriver<GpDriverIDs::kSystemServices>(sysServices);
drivers->SetDriver<GpDriverIDs::kLog>(logger);
drivers->SetDriver<GpDriverIDs::kAlloc>(alloc);
g_gpWindowsGlobals.m_hInstance = hInstance;
g_gpWindowsGlobals.m_hPrevInstance = hPrevInstance;
@@ -448,7 +452,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
g_gpGlobalConfig.m_osGlobals = &g_gpWindowsGlobals;
g_gpGlobalConfig.m_logger = logger;
g_gpGlobalConfig.m_systemServices = GpSystemServices_Win32::GetInstance();
g_gpGlobalConfig.m_systemServices = sysServices;
g_gpGlobalConfig.m_allocator = alloc;
GpDisplayDriverFactory::RegisterDisplayDriverFactory(EGpDisplayDriverType_D3D11, GpDriver_CreateDisplayDriver_D3D11);
GpAudioDriverFactory::RegisterAudioDriverFactory(EGpAudioDriverType_XAudio2, GpDriver_CreateAudioDriver_XAudio2);

View File

@@ -1,5 +1,6 @@
#include "GpMutex_Win32.h"
#include "IGpAllocator.h"
#include "GpWindows.h"
#include <stdlib.h>
@@ -7,8 +8,9 @@
void GpMutex_Win32::Destroy()
{
IGpAllocator *alloc = m_alloc;
this->~GpMutex_Win32();
free(this);
alloc->Release(this);
}
void GpMutex_Win32::Lock()
@@ -22,16 +24,17 @@ void GpMutex_Win32::Unlock()
}
GpMutex_Win32 *GpMutex_Win32::Create()
GpMutex_Win32 *GpMutex_Win32::Create(IGpAllocator *alloc)
{
void *storage = malloc(sizeof(GpMutex_Win32));
void *storage = alloc->Alloc(sizeof(GpMutex_Win32));
if (!storage)
return nullptr;
return new (storage) GpMutex_Win32();
return new (storage) GpMutex_Win32(alloc);
}
GpMutex_Win32::GpMutex_Win32()
GpMutex_Win32::GpMutex_Win32(IGpAllocator *alloc)
: m_alloc(alloc)
{
InitializeCriticalSection(&m_critSection);
}

View File

@@ -4,6 +4,8 @@
#include "GpWindows.h"
struct IGpAllocator;
class GpMutex_Win32 final : public IGpMutex
{
public:
@@ -11,11 +13,12 @@ public:
void Lock() override;
void Unlock() override;
static GpMutex_Win32 *Create();
static GpMutex_Win32 *Create(IGpAllocator *alloc);
private:
const GpMutex_Win32();
explicit GpMutex_Win32(IGpAllocator *alloc);
~GpMutex_Win32();
CRITICAL_SECTION m_critSection;
IGpAllocator *m_alloc;
};

View File

@@ -2,6 +2,7 @@
#include "GpMutex_Win32.h"
#include "GpThreadEvent_Win32.h"
#include "GpWindows.h"
#include "GpAllocator_C.h"
#include "IGpClipboardContents.h"
@@ -133,6 +134,7 @@ static DWORD WINAPI StaticStartThread(LPVOID lpThreadParameter)
GpSystemServices_Win32::GpSystemServices_Win32()
: m_isTouchscreenSimulation(false)
, m_alloc(GpAllocator_C::GetInstance())
{
}
@@ -180,17 +182,17 @@ void GpSystemServices_Win32::GetLocalDateTime(unsigned int &year, unsigned int &
IGpMutex *GpSystemServices_Win32::CreateMutex()
{
return GpMutex_Win32::Create();
return GpMutex_Win32::Create(m_alloc);
}
IGpMutex *GpSystemServices_Win32::CreateRecursiveMutex()
{
return GpMutex_Win32::Create();
return GpMutex_Win32::Create(m_alloc);
}
IGpThreadEvent *GpSystemServices_Win32::CreateThreadEvent(bool autoReset, bool startSignaled)
{
return GpThreadEvent_Win32::Create(autoReset, startSignaled);
return GpThreadEvent_Win32::Create(m_alloc, autoReset, startSignaled);
}
void *GpSystemServices_Win32::CreateThread(ThreadFunc_t threadFunc, void *context)

View File

@@ -48,6 +48,8 @@ public:
private:
bool m_isTouchscreenSimulation;
IGpAllocator *m_alloc;
static GpSystemServices_Win32 ms_instance;
};

View File

@@ -1,4 +1,5 @@
#include "GpThreadEvent_Win32.h"
#include "IGpAllocator.h"
#include <stdlib.h>
#include <new>
@@ -20,28 +21,30 @@ void GpThreadEvent_Win32::Signal()
void GpThreadEvent_Win32::Destroy()
{
IGpAllocator *alloc = m_alloc;
this->~GpThreadEvent_Win32();
free(this);
alloc->Release(this);
}
GpThreadEvent_Win32 *GpThreadEvent_Win32::Create(bool autoReset, bool startSignaled)
GpThreadEvent_Win32 *GpThreadEvent_Win32::Create(IGpAllocator *alloc, bool autoReset, bool startSignaled)
{
HANDLE handle = CreateEventA(nullptr, autoReset ? FALSE : TRUE, startSignaled ? TRUE : FALSE, nullptr);
if (handle == nullptr)
return nullptr;
void *storage = malloc(sizeof(GpThreadEvent_Win32));
void *storage = alloc->Alloc(sizeof(GpThreadEvent_Win32));
if (!storage)
{
CloseHandle(handle);
return nullptr;
}
return new (storage) GpThreadEvent_Win32(handle);
return new (storage) GpThreadEvent_Win32(alloc, handle);
}
GpThreadEvent_Win32::GpThreadEvent_Win32(const HANDLE &handle)
GpThreadEvent_Win32::GpThreadEvent_Win32(IGpAllocator *alloc, const HANDLE &handle)
: m_event(handle)
, m_alloc(alloc)
{
}

View File

@@ -12,11 +12,12 @@ public:
void Signal() override;
void Destroy() override;
static GpThreadEvent_Win32 *Create(bool autoReset, bool startSignaled);
static GpThreadEvent_Win32 *Create(IGpAllocator *alloc, bool autoReset, bool startSignaled);
private:
explicit GpThreadEvent_Win32(const HANDLE &handle);
explicit GpThreadEvent_Win32(IGpAllocator *alloc, const HANDLE &handle);
~GpThreadEvent_Win32();
HANDLE m_event;
IGpAllocator *m_alloc;
};