mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Introduced a common RAII class for critical sections
This commit is contained in:
parent
0a05ef1174
commit
2937bde6a4
@ -14,10 +14,10 @@
|
||||
#include "CompatPrimarySurface.h"
|
||||
#include "DDrawProcs.h"
|
||||
#include "RealPrimarySurface.h"
|
||||
#include "ScopedCriticalSection.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
CRITICAL_SECTION g_gdiCriticalSection;
|
||||
std::atomic<DWORD> g_renderingRefCount = 0;
|
||||
DWORD g_ddLockThreadRenderingRefCount = 0;
|
||||
DWORD g_ddLockThreadId = 0;
|
||||
@ -128,25 +128,6 @@ namespace CompatGdi
|
||||
{
|
||||
CRITICAL_SECTION g_gdiCriticalSection;
|
||||
|
||||
GdiScopedThreadLock::GdiScopedThreadLock() : m_isLocked(true)
|
||||
{
|
||||
EnterCriticalSection(&g_gdiCriticalSection);
|
||||
}
|
||||
|
||||
GdiScopedThreadLock::~GdiScopedThreadLock()
|
||||
{
|
||||
unlock();
|
||||
}
|
||||
|
||||
void GdiScopedThreadLock::unlock()
|
||||
{
|
||||
if (m_isLocked)
|
||||
{
|
||||
LeaveCriticalSection(&g_gdiCriticalSection);
|
||||
m_isLocked = false;
|
||||
}
|
||||
}
|
||||
|
||||
bool beginGdiRendering()
|
||||
{
|
||||
if (!RealPrimarySurface::isFullScreen())
|
||||
@ -182,7 +163,7 @@ namespace CompatGdi
|
||||
|
||||
void endGdiRendering()
|
||||
{
|
||||
CompatGdi::GdiScopedThreadLock gdiLock;
|
||||
Compat::ScopedCriticalSection gdiLock(CompatGdi::g_gdiCriticalSection);
|
||||
|
||||
if (GetCurrentThreadId() == g_ddLockThreadId)
|
||||
{
|
||||
@ -257,7 +238,7 @@ namespace CompatGdi
|
||||
|
||||
void updatePalette(DWORD startingEntry, DWORD count)
|
||||
{
|
||||
GdiScopedThreadLock gdiLock;
|
||||
Compat::ScopedCriticalSection gdiLock(g_gdiCriticalSection);
|
||||
CompatGdiDcCache::clear();
|
||||
|
||||
if (CompatPrimarySurface::palette)
|
||||
|
@ -6,16 +6,6 @@
|
||||
|
||||
namespace CompatGdi
|
||||
{
|
||||
class GdiScopedThreadLock
|
||||
{
|
||||
public:
|
||||
GdiScopedThreadLock();
|
||||
~GdiScopedThreadLock();
|
||||
void unlock();
|
||||
private:
|
||||
bool m_isLocked;
|
||||
};
|
||||
|
||||
bool beginGdiRendering();
|
||||
void endGdiRendering();
|
||||
|
||||
@ -23,4 +13,6 @@ namespace CompatGdi
|
||||
void installHooks();
|
||||
void invalidate(const RECT* rect);
|
||||
void updatePalette(DWORD startingEntry, DWORD count);
|
||||
|
||||
extern CRITICAL_SECTION g_gdiCriticalSection;
|
||||
};
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "CompatGdiCaret.h"
|
||||
#include "CompatGdiDc.h"
|
||||
#include "Hook.h"
|
||||
#include "ScopedCriticalSection.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
@ -91,11 +92,11 @@ namespace
|
||||
|
||||
void updateCaret()
|
||||
{
|
||||
EnterCriticalSection(&g_caretCriticalSection);
|
||||
Compat::ScopedCriticalSection lock(g_caretCriticalSection);
|
||||
|
||||
CaretData newCaret = getCaretData();
|
||||
if (newCaret == g_caret)
|
||||
{
|
||||
LeaveCriticalSection(&g_caretCriticalSection);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -107,7 +108,6 @@ namespace
|
||||
}
|
||||
|
||||
g_caret = newCaret;
|
||||
LeaveCriticalSection(&g_caretCriticalSection);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "CompatGdiDcCache.h"
|
||||
#include "DDrawLog.h"
|
||||
#include "Hook.h"
|
||||
#include "ScopedCriticalSection.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
@ -157,7 +158,7 @@ namespace CompatGdiDc
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
CompatGdi::GdiScopedThreadLock gdiLock;
|
||||
Compat::ScopedCriticalSection gdiLock(CompatGdi::g_gdiCriticalSection);
|
||||
|
||||
auto it = g_origDcToCompatDc.find(origDc);
|
||||
if (it != g_origDcToCompatDc.end())
|
||||
@ -202,7 +203,7 @@ namespace CompatGdiDc
|
||||
|
||||
void releaseDc(HDC origDc)
|
||||
{
|
||||
CompatGdi::GdiScopedThreadLock gdiLock;
|
||||
Compat::ScopedCriticalSection gdiLock(CompatGdi::g_gdiCriticalSection);
|
||||
|
||||
auto it = g_origDcToCompatDc.find(origDc);
|
||||
if (it == g_origDcToCompatDc.end())
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "CompatGdiTitleBar.h"
|
||||
#include "CompatGdiWinProc.h"
|
||||
#include "DDrawLog.h"
|
||||
#include "ScopedCriticalSection.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
@ -37,7 +38,7 @@ namespace
|
||||
}
|
||||
else if (WM_DESTROY == ret->message)
|
||||
{
|
||||
CompatGdi::GdiScopedThreadLock lock;
|
||||
Compat::ScopedCriticalSection lock(CompatGdi::g_gdiCriticalSection);
|
||||
g_prevWindowRect.erase(ret->hwnd);
|
||||
}
|
||||
else if (WM_WINDOWPOSCHANGED == ret->message)
|
||||
@ -148,7 +149,7 @@ namespace
|
||||
|
||||
void onWindowPosChanged(HWND hwnd)
|
||||
{
|
||||
CompatGdi::GdiScopedThreadLock lock;
|
||||
Compat::ScopedCriticalSection lock(CompatGdi::g_gdiCriticalSection);
|
||||
|
||||
const auto it = g_prevWindowRect.find(hwnd);
|
||||
if (it != g_prevWindowRect.end())
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "DDrawTypes.h"
|
||||
#include "Hook.h"
|
||||
#include "RealPrimarySurface.h"
|
||||
#include "ScopedCriticalSection.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
@ -121,11 +122,10 @@ namespace CompatPaletteConverter
|
||||
return false;
|
||||
}
|
||||
|
||||
EnterCriticalSection(&g_criticalSection);
|
||||
Compat::ScopedCriticalSection lock(g_criticalSection);
|
||||
g_oldBitmap = SelectObject(dc, dib);
|
||||
g_dc = dc;
|
||||
g_surface = surface;
|
||||
LeaveCriticalSection(&g_criticalSection);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -149,11 +149,10 @@ namespace CompatPaletteConverter
|
||||
|
||||
void release()
|
||||
{
|
||||
EnterCriticalSection(&g_criticalSection);
|
||||
Compat::ScopedCriticalSection lock(g_criticalSection);
|
||||
|
||||
if (!g_surface)
|
||||
{
|
||||
LeaveCriticalSection(&g_criticalSection);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -163,13 +162,11 @@ namespace CompatPaletteConverter
|
||||
DeleteObject(SelectObject(g_dc, g_oldBitmap));
|
||||
DeleteDC(g_dc);
|
||||
g_dc = nullptr;
|
||||
|
||||
LeaveCriticalSection(&g_criticalSection);
|
||||
}
|
||||
|
||||
void setClipper(IDirectDrawClipper* clipper)
|
||||
{
|
||||
EnterCriticalSection(&g_criticalSection);
|
||||
Compat::ScopedCriticalSection lock(g_criticalSection);
|
||||
if (g_surface)
|
||||
{
|
||||
HRESULT result = CompatDirectDrawSurface<IDirectDrawSurface7>::s_origVtable.SetClipper(
|
||||
@ -179,7 +176,6 @@ namespace CompatPaletteConverter
|
||||
LOG_ONCE("Failed to set a clipper on the palette converter surface: " << result);
|
||||
}
|
||||
}
|
||||
LeaveCriticalSection(&g_criticalSection);
|
||||
}
|
||||
|
||||
void setHalftonePalette()
|
||||
@ -191,7 +187,7 @@ namespace CompatPaletteConverter
|
||||
|
||||
void setPrimaryPalette(DWORD startingEntry, DWORD count)
|
||||
{
|
||||
EnterCriticalSection(&g_criticalSection);
|
||||
Compat::ScopedCriticalSection lock(g_criticalSection);
|
||||
if (g_dc)
|
||||
{
|
||||
if (CompatPrimarySurface::palette)
|
||||
@ -207,7 +203,6 @@ namespace CompatPaletteConverter
|
||||
SetDIBColorTable(g_dc, 0, 256, g_halftonePalette);
|
||||
}
|
||||
}
|
||||
LeaveCriticalSection(&g_criticalSection);
|
||||
}
|
||||
|
||||
void unlockDc()
|
||||
|
@ -174,6 +174,7 @@
|
||||
<ClInclude Include="Hook.h" />
|
||||
<ClInclude Include="IReleaseNotifier.h" />
|
||||
<ClInclude Include="RealPrimarySurface.h" />
|
||||
<ClInclude Include="ScopedCriticalSection.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="CompatDirectDraw.cpp" />
|
||||
|
@ -105,6 +105,9 @@
|
||||
<ClInclude Include="CompatPaletteConverter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ScopedCriticalSection.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="DllMain.cpp">
|
||||
|
36
DDrawCompat/ScopedCriticalSection.h
Normal file
36
DDrawCompat/ScopedCriticalSection.h
Normal file
@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
|
||||
#include <Windows.h>
|
||||
|
||||
namespace Compat
|
||||
{
|
||||
class ScopedCriticalSection
|
||||
{
|
||||
public:
|
||||
ScopedCriticalSection(CRITICAL_SECTION& cs)
|
||||
: m_cs(cs), m_isLocked(true)
|
||||
{
|
||||
EnterCriticalSection(&m_cs);
|
||||
}
|
||||
|
||||
~ScopedCriticalSection()
|
||||
{
|
||||
unlock();
|
||||
}
|
||||
|
||||
void unlock()
|
||||
{
|
||||
if (m_isLocked)
|
||||
{
|
||||
LeaveCriticalSection(&m_cs);
|
||||
m_isLocked = false;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
CRITICAL_SECTION& m_cs;
|
||||
bool m_isLocked;
|
||||
};
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user