17 #define KY_WAIT_INFINITE 0xFFFFFFFF
28 class AcquireInterface;
51 class AcquireInterface
54 virtual ~AcquireInterface() {}
60 virtual bool CanAcquire();
70 virtual bool TryAcquire();
73 virtual bool TryAcquireCommit();
76 virtual bool TryAcquireCancel();
79 static bool AcquireMultipleObjects(Waitable** waitList,
unsigned waitCount,
unsigned delay = KY_WAIT_INFINITE);
83 static int AcquireOneOfMultipleObjects(Waitable** waitList,
unsigned waitCount,
unsigned delay = KY_WAIT_INFINITE);
89 class DefaultAcquireInterface :
public AcquireInterface
92 virtual ~DefaultAcquireInterface() {}
96 static DefaultAcquireInterface* GetDefaultAcquireInterface();
114 class Waitable :
public RefCountBase<Waitable, Stat_Default_Mem>
118 typedef void (*WaitHandler)(
void* pdata);
134 HandlerStruct(WaitHandler h,
void* pd)
139 HandlerStruct(
const HandlerStruct& src)
141 Handler = src.Handler;
142 pUserData = src.pUserData;
145 HandlerStruct& operator=(
const HandlerStruct& src)
147 Handler = src.Handler;
148 pUserData = src.pUserData;
152 bool operator==(
const HandlerStruct& src) {
return (Handler == src.Handler) && (pUserData == src.pUserData); }
160 struct HandlerArray :
public NewOverrideBase<Stat_Default_Mem>
162 typedef ArrayConstPolicy<0, 16, true> SizePolicyType;
163 typedef Array<HandlerStruct, Stat_Default_Mem, SizePolicyType> HandlerArrayType;
165 std::atomic<SInt32> RefCount;
166 HandlerArrayType Handlers;
169 HandlerArray() { RefCount = 1; }
171 void AddRef() { RefCount++; }
178 void CallWaitHandlers();
186 HandlerArray* pHandlers;
191 Waitable(
bool enable);
197 void CallWaitHandlers();
201 class CallableHandlers
203 friend class Waitable;
204 Ptr<HandlerArray> pArray;
207 CallableHandlers() {}
210 inline void CallWaitHandlers()
213 pArray->CallWaitHandlers();
217 inline void GetCallableHandlers(CallableHandlers* ph)
220 ph->pArray = pHandlers;
226 bool AddWaitHandler(WaitHandler handler,
void* pdata);
227 bool RemoveWaitHandler(WaitHandler handler,
void* pdata);
230 bool Wait(
unsigned delay = KY_WAIT_INFINITE);
233 bool Acquire(
unsigned delay = KY_WAIT_INFINITE);
238 virtual bool IsSignaled()
const;
241 virtual AcquireInterface* GetAcquireInterface();
252 class Mutex :
public Waitable,
public AcquireInterface
254 friend class WaitConditionImpl;
255 friend class MutexImpl;
262 Mutex(
bool recursive = 1,
bool multiWait = 0);
272 bool IsLockedByAnotherThread();
278 virtual bool IsSignaled()
const;
279 virtual AcquireInterface* GetAcquireInterface();
282 virtual bool CanAcquire();
283 virtual bool TryAcquire();
284 virtual bool TryAcquireCommit();
285 virtual bool TryAcquireCancel();
293 Locker(Mutex* pmutex)
298 ~Locker() { pMutex->Unlock(); }
315 class WaitConditionImpl;
319 friend class WaitConditionImpl;
321 WaitConditionImpl* pImpl;
330 bool Wait(Mutex* pmutex,
unsigned delay = KY_WAIT_INFINITE);
341 class Event :
public Waitable,
public AcquireInterface
345 volatile bool Temporary;
346 mutable Mutex StateMutex;
347 WaitCondition StateWaitCondition;
351 Event(
bool setInitially = 0,
bool multiWait = 0);
356 bool Wait(
unsigned delay = KY_WAIT_INFINITE);
370 virtual bool IsSignaled()
const;
372 virtual AcquireInterface* GetAcquireInterface();
375 virtual bool CanAcquire();
376 virtual bool TryAcquire();
377 virtual bool TryAcquireCommit();
378 virtual bool TryAcquireCancel();
391 class Semaphore :
public Waitable,
public AcquireInterface
397 mutable Mutex ValueMutex;
398 WaitCondition ValueWaitCondition;
402 Semaphore(
int maxValue = 1,
bool multiWait = 0);
406 int GetMaxValue()
const;
407 int GetValue()
const;
408 int GetAvailable()
const;
415 bool ObtainSemaphore(
int count = 1,
unsigned delay = KY_WAIT_INFINITE);
419 bool ReleaseSemaphore(
int count = 1);
427 int operator+=(
int count);
428 int operator-=(
int count);
436 Waitable* CreateWaitableIncrement(
int count);
440 virtual bool CanAcquire();
441 virtual bool TryAcquire();
442 virtual bool TryAcquireCommit();
443 virtual bool TryAcquireCancel();
446 virtual bool IsSignaled()
const;
447 virtual AcquireInterface* GetAcquireInterface();
453 Semaphore* pSemaphore;
455 Locker(Semaphore* psemaphore,
int count = 1)
457 pSemaphore = psemaphore;
459 pSemaphore->ObtainSemaphore(count);
461 ~Locker() { pSemaphore->ReleaseSemaphore(Count); }
468 typedef size_t ThreadId;
473 #define KY_THREAD_STARTED 0x01
476 #define KY_THREAD_FINISHED 0x02
479 #define KY_THREAD_START_SUSPENDED 0x08
482 #define KY_THREAD_EXIT 0x10
485 class Thread :
public Waitable,
public AcquireInterface
493 typedef int (*ThreadFn)(Thread* pthread,
void* h);
496 ThreadFn ThreadFunction;
524 CreateParams(ThreadFn func = 0,
void* hand = 0, UPInt ssize = 128 * 1024,
int proc = -1, ThreadState state = NotRunning, ThreadPriority prior = NormalPriority)
525 : threadFunction(func), userHandle(hand), stackSize(ssize), processor(proc), initialState(state), priority(prior)
529 ThreadFn threadFunction;
533 ThreadState initialState;
534 ThreadPriority priority;
543 Thread(UPInt stackSize = 128 * 1024,
int processor = -1);
549 Thread(ThreadFn threadFunction,
void* userHandle = 0, UPInt stackSize = 128 * 1024,
int processor = -1, ThreadState initialState = NotRunning);
552 explicit Thread(
const CreateParams& params);
560 static void FinishAllThreads();
569 virtual void OnExit();
577 virtual bool Start(ThreadState initialState = Running);
580 virtual void Exit(
int exitCode = 0);
584 bool GetExitFlag()
const;
585 void SetExitFlag(
bool exitFlag);
588 bool IsFinished()
const;
591 bool IsSuspended()
const;
594 ThreadState GetThreadState()
const;
597 static int GetCPUCount();
601 inline int GetExitCode()
const {
return ExitCode; }
603 std::thread* GetOSHandle()
const {
return ThreadHandle; }
605 ThreadId GetThreadId()
const {
return IdValue != std::thread::id() ? std::hash<std::thread::id>()(std::this_thread::get_id()) : 0; }
608 static bool Sleep(
unsigned secs);
611 static bool MSleep(
unsigned msecs);
616 virtual bool IsSignaled()
const {
return (ThreadFlags & KY_THREAD_FINISHED) != 0; }
620 virtual AcquireInterface* GetAcquireInterface() {
return this; }
623 virtual bool CanAcquire() {
return IsSignaled(); }
624 virtual bool TryAcquire() {
return IsSignaled(); }
626 virtual void SetThreadName(
const char* name) { KY_UNUSED(name); }
628 friend void Thread_Std11StartFunc(
void* phandle);
632 std::atomic<UInt32> ThreadFlags;
633 std::atomic<SInt32> SuspendCount;
638 ThreadPriority Priority;
641 void CleanupSystemThread();
643 std::thread* ThreadHandle;
644 std::thread::id IdValue;
653 void FinishAndRelease();
655 void Init(
const CreateParams& params);
658 Thread(
const Thread& source) : Waitable(1) { KY_UNUSED(source); }
662 ThreadId GetCurrentThreadId();
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17