From 2937bde6a4ab8722383833870bd938f421f8fe5d Mon Sep 17 00:00:00 2001 From: narzoul Date: Wed, 13 Apr 2016 20:58:30 +0200 Subject: [PATCH] Introduced a common RAII class for critical sections --- DDrawCompat/CompatGdi.cpp | 25 +++-------------- DDrawCompat/CompatGdi.h | 12 ++------- DDrawCompat/CompatGdiCaret.cpp | 6 ++--- DDrawCompat/CompatGdiDc.cpp | 5 ++-- DDrawCompat/CompatGdiWinProc.cpp | 5 ++-- DDrawCompat/CompatPaletteConverter.cpp | 15 ++++------- DDrawCompat/DDrawCompat.vcxproj | 1 + DDrawCompat/DDrawCompat.vcxproj.filters | 3 +++ DDrawCompat/ScopedCriticalSection.h | 36 +++++++++++++++++++++++++ 9 files changed, 59 insertions(+), 49 deletions(-) create mode 100644 DDrawCompat/ScopedCriticalSection.h diff --git a/DDrawCompat/CompatGdi.cpp b/DDrawCompat/CompatGdi.cpp index 5fd70e0..a47c106 100644 --- a/DDrawCompat/CompatGdi.cpp +++ b/DDrawCompat/CompatGdi.cpp @@ -14,10 +14,10 @@ #include "CompatPrimarySurface.h" #include "DDrawProcs.h" #include "RealPrimarySurface.h" +#include "ScopedCriticalSection.h" namespace { - CRITICAL_SECTION g_gdiCriticalSection; std::atomic 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) diff --git a/DDrawCompat/CompatGdi.h b/DDrawCompat/CompatGdi.h index 74e9c0b..7cc68ba 100644 --- a/DDrawCompat/CompatGdi.h +++ b/DDrawCompat/CompatGdi.h @@ -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; }; diff --git a/DDrawCompat/CompatGdiCaret.cpp b/DDrawCompat/CompatGdiCaret.cpp index ca8e5bf..dbe15e2 100644 --- a/DDrawCompat/CompatGdiCaret.cpp +++ b/DDrawCompat/CompatGdiCaret.cpp @@ -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); } } diff --git a/DDrawCompat/CompatGdiDc.cpp b/DDrawCompat/CompatGdiDc.cpp index f6b54f3..1d244d9 100644 --- a/DDrawCompat/CompatGdiDc.cpp +++ b/DDrawCompat/CompatGdiDc.cpp @@ -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()) diff --git a/DDrawCompat/CompatGdiWinProc.cpp b/DDrawCompat/CompatGdiWinProc.cpp index cd5064b..692722d 100644 --- a/DDrawCompat/CompatGdiWinProc.cpp +++ b/DDrawCompat/CompatGdiWinProc.cpp @@ -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()) diff --git a/DDrawCompat/CompatPaletteConverter.cpp b/DDrawCompat/CompatPaletteConverter.cpp index 7bebc97..a5c834e 100644 --- a/DDrawCompat/CompatPaletteConverter.cpp +++ b/DDrawCompat/CompatPaletteConverter.cpp @@ -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::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() diff --git a/DDrawCompat/DDrawCompat.vcxproj b/DDrawCompat/DDrawCompat.vcxproj index 9a07513..cbb1100 100644 --- a/DDrawCompat/DDrawCompat.vcxproj +++ b/DDrawCompat/DDrawCompat.vcxproj @@ -174,6 +174,7 @@ + diff --git a/DDrawCompat/DDrawCompat.vcxproj.filters b/DDrawCompat/DDrawCompat.vcxproj.filters index 8dd014d..d07cb63 100644 --- a/DDrawCompat/DDrawCompat.vcxproj.filters +++ b/DDrawCompat/DDrawCompat.vcxproj.filters @@ -105,6 +105,9 @@ Header Files + + Header Files + diff --git a/DDrawCompat/ScopedCriticalSection.h b/DDrawCompat/ScopedCriticalSection.h new file mode 100644 index 0000000..e3aff9f --- /dev/null +++ b/DDrawCompat/ScopedCriticalSection.h @@ -0,0 +1,36 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN + +#include + +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; + }; +};