DiosLock.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #pragma once
  2. // 下列 ifdef 块是创建使从 DLL 导出更简单的
  3. // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DIOSLOCK_EXPORTS
  4. // 符号编译的。在使用此 DLL 的
  5. // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
  6. // DIOSLOCK_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
  7. // 符号视为是被导出的。
  8. #ifndef DIOSLOCK_EXPORTS
  9. #ifdef _WIN64
  10. #ifdef _DEBUG
  11. #pragma comment(lib, "DiosLockX64D.lib")
  12. #else
  13. #pragma comment(lib, "DiosLockX64.lib")
  14. #endif
  15. #else
  16. #ifdef _DEBUG
  17. #pragma comment(lib, "DiosLockD.lib")
  18. #else
  19. #pragma comment(lib, "DiosLock.lib")
  20. #endif
  21. #endif
  22. #endif
  23. #ifdef DIOSLOCK_EXPORTS
  24. #define DIOSLOCK_API __declspec(dllexport)
  25. #define DIOSLOCK_C_API extern "C" __declspec(dllexport)
  26. #else
  27. #define DIOSLOCK_API __declspec(dllimport)
  28. #define DIOSLOCK_C_API extern "C" __declspec(dllimport)
  29. #endif
  30. class DIOSLOCK_API DiosLock {
  31. //DWORD m_LockTime;
  32. protected:
  33. DWORD m_LockThreadId;
  34. //volatile LONG m_ProcLock;
  35. volatile unsigned long m_RefCount;
  36. volatile unsigned long m_InterLock;
  37. HANDLE m_LockHandle;
  38. bool DiosInternal_EnterCriticalSection(DWORD TryCount);
  39. void DiosInternal_LeaveCriticalSection();
  40. bool Try_Clear_DeadThread();
  41. INT FindProcessThreads(DWORD dwOwnerTID);
  42. DWORD Thread_WaitUnlockNotify(DWORD timeout = INFINITE);
  43. public:
  44. DiosLock(void);
  45. virtual ~DiosLock(void);
  46. DWORD Thread_Lock(DWORD timeout = INFINITE);
  47. void Thread_UnLock();
  48. bool Thread_Clear(DWORD Tid);
  49. //DWORD Machine_Lock(DWORD timeout);
  50. //DWORD Machine_UnLock();
  51. //DWORD Group_Lock(DWORD timeout);
  52. //DWORD Group_UnLock();
  53. };
  54. DIOSLOCK_C_API void CleanupForThread(DWORD Tid);
  55. #pragma warning( push )
  56. #pragma warning( disable : 4114 )
  57. DIOSLOCK_C_API bool Dios_ThreadLock(volatile UINT64 volatile *pLock);
  58. DIOSLOCK_C_API void Dios_ThreadUnLock(volatile UINT64 volatile *pLock);
  59. DIOSLOCK_C_API void Dios_ThreadClearForTid(volatile UINT64 volatile *pLock, DWORD Tid);
  60. #pragma warning( pop )
  61. DIOSLOCK_C_API DWORD Proc_Lock(DWORD timeout);
  62. DIOSLOCK_C_API void Proc_UnLock();
  63. DIOSLOCK_C_API DWORD Thread_GetUniqTick();