Mercurial > foo_out_sdl
diff foosdk/sdk/pfc/synchro_win.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/pfc/synchro_win.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,71 @@ +#pragma once + +class _critical_section_base { +protected: + CRITICAL_SECTION sec; +public: + _critical_section_base() = default; + inline void enter() noexcept {EnterCriticalSection(&sec);} + inline void leave() noexcept {LeaveCriticalSection(&sec);} + inline void create() noexcept { +#ifdef PFC_WINDOWS_DESKTOP_APP + InitializeCriticalSection(&sec); +#else + InitializeCriticalSectionEx(&sec,0,0); +#endif + } + inline void destroy() noexcept {DeleteCriticalSection(&sec);} + inline bool tryEnter() noexcept { return !!TryEnterCriticalSection(&sec); } +private: + _critical_section_base(const _critical_section_base&) = delete; + void operator=(const _critical_section_base&) = delete; +}; + +// Static-lifetime critical section, no cleanup - valid until process termination +class critical_section_static : public _critical_section_base { +public: + critical_section_static() noexcept {create();} +#if !PFC_LEAK_STATIC_OBJECTS + ~critical_section_static() noexcept {destroy();} +#endif +}; + +// Regular critical section, intended for any lifetime scopes +class critical_section : public _critical_section_base { +public: + critical_section() noexcept {create();} + ~critical_section() noexcept {destroy();} +}; + +namespace pfc { + +// Read write lock - Vista-and-newer friendly lock that allows concurrent reads from a resource that permits such +// Warning, non-recursion proof +class readWriteLock { +public: + readWriteLock() = default; + + void enterRead() noexcept { + AcquireSRWLockShared( & theLock ); + } + void enterWrite() noexcept { + AcquireSRWLockExclusive( & theLock ); + } + void leaveRead() noexcept { + ReleaseSRWLockShared( & theLock ); + } + void leaveWrite() noexcept { + ReleaseSRWLockExclusive( &theLock ); + } + +private: + readWriteLock(const readWriteLock&) = delete; + void operator=(const readWriteLock&) = delete; + + SRWLOCK theLock = SRWLOCK_INIT; +}; + +typedef ::_critical_section_base mutexBase_t; +typedef ::critical_section mutex; + +}
