Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

67 lines
1.8 KiB
C++

#ifndef __CRITICALHPP__
#define __CRITICALHPP__
#include <windows.h>
#include <assert.h>
// macro to help with using the SMART_CRITICAL class
// you can just say CRITICAL_CONTROL(ThreadSafe), this will
// place the current scope in a critical section
#define CRITICAL_CONTROL(x) SMART_CRITICAL crit##x (x)
#define CRITICAL_CONTROL_2(x,y) SMART_CRITICAL crit##x (y)
// class to handle controling critical sections
// you would use this class to create thread safe and exception safe code
// since the LeaveCriticalSection is in the destructor it will automatically
// be called when the class goes out of scope, for instance when the stack
// is unwinding from an exception
class SMART_CRITICAL {
private:
CRITICAL_SECTION *m_Crit;
public:
SMART_CRITICAL (CRITICAL_SECTION& crit)
{
m_Crit = &crit;
EnterCriticalSection (m_Crit);
}
~SMART_CRITICAL (void)
{
LeaveCriticalSection (m_Crit);
}
};
// class to handle global critical sections
// the constructor will automatically init the critical section and
// the destructor will automatically delete the critical section.
// This makes it useful for globals for instance, the class will automatically
// create and destroy the critical section for you.
// Note: for various reason I made it bad to create this class dynamically
class ROOT_CRITICAL : public CRITICAL_SECTION {
public:
ROOT_CRITICAL (void)
{
InitializeCriticalSection (this);
}
ROOT_CRITICAL( const ROOT_CRITICAL&)
{
InitializeCriticalSection( this );
}
~ROOT_CRITICAL (void)
{
DeleteCriticalSection (this);
}
void Lock(void)
{
EnterCriticalSection(this);
}
void Unlock(void)
{
LeaveCriticalSection(this);
}
void *operator new (size_t)
{
assert (false);
return NULL;
}
};
#endif