12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #pragma once
- #include <pthread.h>
- #include <signal.h>
- #include <unistd.h>
- #include <sys/syscall.h>
- #include <cstdint>
- #include <ctime>
- #include <atomic>
- #include <map>
- #include <algorithm>
- #include <cerrno> // 添加 errno 支持
- // 类型别名
- #ifndef DWORD_DEFINED
- #define DWORD_DEFINED
- typedef unsigned long DWORD; // 定义DWORD
- #endif
- using UINT64 = uint64_t;
- // 常量定义
- #ifndef INFINITE
- #define INFINITE 0xFFFFFFFF
- #endif
- #ifndef WAIT_OBJECT_0
- #define WAIT_OBJECT_0 0
- #endif
- #ifndef WAIT_TIMEOUT
- #define WAIT_TIMEOUT 258
- #endif
- // 原子操作函数
- inline DWORD AtomicCompareExchange(volatile DWORD* dest, DWORD exchange, DWORD compare) {
- return __sync_val_compare_and_swap(dest, compare, exchange);
- }
- class CcosLock {
- protected:
- DWORD m_LockThreadId = 0; // 持有锁的线程ID
- volatile DWORD m_RefCount = 0; // 引用计数
- volatile DWORD m_InterLock = 0;// 内部锁状态
- pthread_mutex_t m_Mutex; // 互斥锁
- pthread_cond_t m_Cond; // 条件变量
- bool CcosInternal_EnterCriticalSection(DWORD TryCount);
- void CcosInternal_LeaveCriticalSection();
- bool Try_Clear_DeadThread();
- int FindProcessThreads(DWORD dwOwnerTID);
- DWORD Thread_WaitUnlockNotify(DWORD timeout = INFINITE);
- public:
- CcosLock();
- virtual ~CcosLock();
- DWORD Thread_Lock(DWORD timeout = INFINITE);
- void Thread_UnLock();
- bool Thread_Clear(DWORD Tid);
- };
- // 全局清理函数
- void CleanupForThread(DWORD Tid);
- // C接口函数
- extern "C" {
- bool Ccos_ThreadLock(volatile UINT64 *pLock);
- void Ccos_ThreadUnLock(volatile UINT64 *pLock);
- void Ccos_ThreadClearForTid(volatile UINT64 *pLock, DWORD Tid);
- DWORD Proc_Lock(DWORD timeout);
- void Proc_UnLock();
- DWORD Thread_GetUniqTick();
- }
- // Linux 辅助函数
- #ifndef GET_CURRENT_THREAD_ID_DEFINED
- #define GET_CURRENT_THREAD_ID_DEFINED
- inline DWORD GetCurrentThreadId() {
- return static_cast<DWORD>(syscall(SYS_gettid));
- }
- #endif
- inline DWORD GetTickCount() {
- struct timespec ts;
- clock_gettime(CLOCK_MONOTONIC, &ts);
- return static_cast<DWORD>(ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
- }
- inline int IsThreadAlive(DWORD dwTid) {
- return pthread_kill(static_cast<pthread_t>(dwTid), 0) == 0 ? 1 : 0;
- }
|