7 #ifndef _INC_cThreadLock_H
8 #define _INC_cThreadLock_H
20 #if defined(__linux__)
27 typedef DWORD THREADID_t;
28 #define _SIZEOF_THREADID 4
29 #elif defined(__linux__)
30 typedef pthread_t THREADID_t;
31 #define _SIZEOF_THREADID _SIZEOF_PTR
37 typedef DWORD THREAD_EXITCODE_t;
38 static constexpr THREAD_EXITCODE_t THREAD_EXITCODE_RUNNING = ((THREAD_EXITCODE_t)STILL_ACTIVE);
39 static constexpr THREAD_EXITCODE_t THREAD_EXITCODE_ERR = ((THREAD_EXITCODE_t)-1);
41 #elif defined(__linux__)
42 typedef void* THREAD_EXITCODE_t;
43 static constexpr THREAD_EXITCODE_t THREAD_EXITCODE_RUNNING = ((THREAD_EXITCODE_t)2);
44 static constexpr THREAD_EXITCODE_t THREAD_EXITCODE_ERR = ((THREAD_EXITCODE_t)1);
50 static constexpr THREAD_EXITCODE_t THREAD_EXITCODE_OK = ((THREAD_EXITCODE_t)0);
64 static const THREADID_t k_NULL = 0;
68 : m_dwThreadId(nThreadId)
85 return IsEqualId(m_dwThreadId, GetCurrentId());
89 return IsValidId(m_dwThreadId);
94 m_dwThreadId = GetCurrentId();
103 return ::GetCurrentThreadId();
105 return ::pthread_self();
113 static inline bool IsEqualId(THREADID_t a, THREADID_t b) noexcept
119 return ::pthread_equal(a, b);
129 ::usleep((uMs) * 1000);
148 : m_bThreadRunning(false)
149 , m_bThreadStopping(false)
156 return m_bThreadRunning;
161 return m_bThreadStopping;
167 m_bThreadStopping =
true;
168 return isThreadRunning();
192 THREADID_t nTid1 = m_nLockThreadID;
198 THREADID_t nTid1 = m_nLockThreadID;
241 ASSERT(isThreadLockedByCurrent());
242 if (SUPER_t::DecLockCount() == 0)
276 : m_bInitialOwner(
false)
282 InitLockMutex(
nullptr,
false);
285 : m_bInitialOwner(bInitialOwner)
287 InitLockMutex(pszMutexName, bInitialOwner);
292 if (m_bInitialOwner && isLocked())
296 #if defined(__linux__)
297 ::pthread_mutex_destroy(&m_Mutex);
307 m_Mutex.
AttachHandle(
_FNF(::CreateMutex)(
nullptr, bInitialOwner, pszMutexName));
314 m_Mutex = k_MutexInit;
326 SUPER_t::IncLockCount();
327 ASSERT(isThreadLockedByCurrent());
344 int iRet = ::pthread_mutex_lock(&m_Mutex);
357 ASSERT(isThreadLockedByCurrent());
358 if (SUPER_t::DecLockCount() <= 0)
363 return ::ReleaseMutex(m_Mutex) ? true :
false;
365 ::pthread_mutex_unlock(&m_Mutex);
380 #elif defined(__USE_XOPEN2K)
381 cTimeSpec tSpec(dwDelayMS);
382 int iRet = ::pthread_mutex_timedlock(&m_Mutex, &tSpec);
392 if (::pthread_mutex_trylock(&m_Mutex) == 0)
399 if (dwWaitTimeMS == 0)
429 CRITICAL_SECTION m_CritSection;
436 ASSERT(isThreadLockedByCurrent());
441 ::InitializeCriticalSection(&m_CritSection);
460 ::DeleteCriticalSection(&m_CritSection);
469 ::EnterCriticalSection(&m_CritSection);
474 ASSERT(isThreadLockedByCurrent());
475 if (DecLockCount() <= 0)
479 ::LeaveCriticalSection(&m_CritSection);
482 #if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400)
486 if (::TryEnterCriticalSection(&m_CritSection) == 0)
505 return (THREADID_t)
isLocked() ? 1 : 0;
511 #if defined(_MT) || defined(__linux__)
#define _FNF(c)
_WIN32 name has a A or W for UTF8 or UNICODE
Definition: FileName.h:24
#define GRAYCORE_LINK
Definition: GrayCore.h:47
#define UNREFERENCED_PARAMETER(P)
< _WIN32 type thing. get rid of stupid warning.
Definition: SysTypes.h:299
#define UNREFERENCED_REFERENCE(x)
Definition: SysTypes.h:318
#define VOLATILE
Definition: SysTypes.h:429
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
bool isLocked() const
Definition: cLocker.h:41
Definition: cNonCopyable.h:17
Definition: cOSHandle.h:59
HRESULT WaitForSingleObject(TIMESYSD_t dwMilliseconds) const
Definition: cOSHandle.cpp:27
void AttachHandle(HANDLE h) noexcept
Definition: cOSHandle.h:163
Definition: cThreadLock.h:55
THREADID_t get_HashCode() const noexcept
Definition: cThreadLock.h:77
void InitCurrentId() noexcept
Definition: cThreadLock.h:91
static void SleepCurrent(TIMESYS_t uMs=cTimeSys::k_FREQ) noexcept
Definition: cThreadLock.h:122
THREADID_t GetThreadId() const noexcept
Definition: cThreadLock.h:71
static THREADID_t GetCurrentId() noexcept
Definition: cThreadLock.h:97
static bool IsEqualId(THREADID_t a, THREADID_t b) noexcept
Definition: cThreadLock.h:113
bool isValidId() const noexcept
Definition: cThreadLock.h:87
cThreadId(THREADID_t nThreadId=k_NULL) noexcept
Definition: cThreadLock.h:67
bool isCurrentThread() const noexcept
Definition: cThreadLock.h:82
THREADID_t m_dwThreadId
unique thread id. i.e. stack base pointer. (Use the MFC name)
Definition: cThreadLock.h:61
static bool IsValidId(THREADID_t id) noexcept
Definition: cThreadLock.h:108
static const THREADID_t k_NULL
Not a valid thread Id.
Definition: cThreadLock.h:64
Definition: cThreadLock.h:173
THREADID_t get_ThreadLockOwner() const
Definition: cThreadLock.h:189
bool isThreadLockedByCurrent() const noexcept
Definition: cThreadLock.h:196
THREADID_t __DECL_ALIGN(_SIZEOF_THREADID) m_nLockThreadID
The thread that has the lock. cThreadId:k_NULL is not locked.
bool isLocked() const noexcept
Definition: cThreadLock.h:184
cThreadLockBase() noexcept
Definition: cThreadLock.h:180
Definition: cThreadLock.h:205
bool ClearThreadLockOwner(THREADID_t nTid)
Definition: cThreadLock.h:226
void Unlock()
Definition: cThreadLock.h:237
~cThreadLockFast() noexcept
Definition: cThreadLock.h:222
cThreadLockFast(const cThreadLockFast &a) noexcept
Definition: cThreadLock.h:215
cThreadLockFast() noexcept
Definition: cThreadLock.h:212
Definition: cThreadLock.h:252
void LockInternal()
Definition: cThreadLock.h:322
bool Unlock()
Definition: cThreadLock.h:354
cThreadLockMutex(const FILECHAR_t *pszMutexName=nullptr, bool bInitialOwner=false) noexcept
Definition: cThreadLock.h:284
static const pthread_mutex_t k_MutexInit
Definition: cThreadLock.h:269
bool m_bInitialOwner
I also lock this myself.
Definition: cThreadLock.h:272
void InitLockMutex(const FILECHAR_t *pszMutexName, bool bInitialOwner) noexcept
Definition: cThreadLock.h:302
~cThreadLockMutex() noexcept
Definition: cThreadLock.h:289
bool LockTry(TIMESYSD_t dwDelayMS=0)
Definition: cThreadLock.h:370
cThreadLockMutex(const cThreadLockMutex &a) noexcept
Definition: cThreadLock.h:275
bool Lock()
Definition: cThreadLock.h:331
pthread_mutex_t m_Mutex
Definition: cThreadLock.h:268
Definition: cThreadLock.h:498
THREADID_t get_ThreadLockOwner() const
Definition: cThreadLock.h:502
Definition: cThreadLock.h:137
volatile bool m_bThreadStopping
trying to stop the thread nicely. Do this before TerminateThread()
Definition: cThreadLock.h:144
bool isThreadRunning() const noexcept
Definition: cThreadLock.h:153
bool isThreadStopping() const noexcept
Definition: cThreadLock.h:158
virtual bool RequestStopThread(bool bWillWait=false) noexcept
Definition: cThreadLock.h:164
cThreadState() noexcept
Definition: cThreadLock.h:147
bool m_bThreadRunning
called CreateThread() onThreadCreate(), and inside Run(), until onThreadExit()
Definition: cThreadLock.h:143
static const TIMESYS_t k_INF
INFINITE in _WIN32. MAILSLOT_WAIT_FOREVER.
Definition: cTimeSys.h:101
static const TIMESYS_t k_FREQ
milliSec per Sec
Definition: cTimeSys.h:100
__DECL_IMPORT TYPE Exchange(TYPE volatile *pnValue, TYPE nValue) noexcept
__DECL_IMPORT TYPE CompareExchange(TYPE volatile *pnValue, TYPE nValue, TYPE lComparand) noexcept
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
cThreadLockStub cThreadLockCount
Definition: cThreadLock.h:514
INT32 TIMESYSD_t
Time delta. signed milli-Seconds Span. cTimeSys::k_DMAX, cTimeSys::k_INF = MAILSLOT_WAIT_FOREVER.
Definition: cTimeSys.h:28
cThreadLockMutex cThreadLockCrit
Definition: cThreadLock.h:494
cLockerT< cThreadLockFast > cThreadGuardFast
Definition: cThreadLock.h:249
cLockerT< cThreadLockMutex > cThreadGuardMutex
Definition: cThreadLock.h:414
char FILECHAR_t
a UTF8 char in a file name. like TCHAR
Definition: FileName.h:22
cLockerT< cThreadLockCount > cThreadGuard
Definition: cThreadLock.h:516
THREAD_EXITCODE_t(_stdcall * THREAD_FUNC_t)(void *)
Definition: cThreadLock.h:52
UINT32 TIMESYS_t
TIMESYS_t = The normal system tick timer. milli-seconds since start of system/app ?
Definition: cTimeSys.h:27