#pragma once
#include "base/source/fobject.h"
#include "pluginterfaces/base/ftypes.h"
#if SMTG_PTHREADS
#include <pthread.h>
#elif SMTG_OS_WINDOWS
struct CRITSECT {
void* DebugInfo; Steinberg::int32 LockCount; Steinberg::int32 RecursionCount; void* OwningThread; void* LockSemaphore; Steinberg::int32 SpinCount; };
#endif
namespace Steinberg {
namespace Base {
namespace Thread {
struct ILock
{
virtual ~ILock () {}
virtual void lock () = 0;
virtual void unlock () = 0;
virtual bool trylock () = 0;
};
class FLock : public ILock
{
public:
FLock (const char8* name = "FLock");
~FLock () SMTG_OVERRIDE;
void lock () SMTG_OVERRIDE;
void unlock () SMTG_OVERRIDE;
bool trylock () SMTG_OVERRIDE;
protected:
#if SMTG_PTHREADS
pthread_mutex_t mutex;
#elif SMTG_OS_WINDOWS
CRITSECT section; #endif
};
class FLockObject : public FObject, public FLock
{
public:
OBJ_METHODS (FLockObject, FObject)
};
class FGuard
{
public:
FGuard (ILock& _lock) : lock (_lock) { lock.lock (); }
~FGuard () { lock.unlock (); }
private:
ILock& lock; };
class FConditionalGuard
{
public:
FConditionalGuard (FLock* _lock) : lock (_lock)
{
if (lock)
lock->lock ();
}
~FConditionalGuard ()
{
if (lock)
lock->unlock ();
}
private:
FLock* lock; };
} } }