00001 00008 #include "dkcThreadLock.h" 00009 #include "dkcStdio.h" 00010 00011 static CRITICAL_SECTION g_csCriticalSection; 00012 static DWORD g_dwLockedThread = 0; // LockしているThreadId(0:非Lock) 00013 static int gLockCount = 0; // Lockされている回数 00014 // (同一スレッドならば複数回Lockできるので) 00015 //初期化しているかどうかフラグ。 00016 static BOOL gInited = FALSE; 00017 00018 00019 00020 static void Init(){ 00021 { 00022 if(TRUE==gInited){return;} 00023 } 00024 InitializeCriticalSection(&g_csCriticalSection); 00025 g_dwLockedThread = (DWORD)-1; 00026 gLockCount = 0; 00027 # ifdef DEBUG 00028 ODS("dkcLockThreadInit\n"); 00029 # endif 00030 gInited = TRUE; 00031 } 00032 00033 static void End(){ 00034 { 00035 if(FALSE==gInited){return;} 00036 } 00037 DeleteCriticalSection(&g_csCriticalSection); 00038 gInited = FALSE; 00039 memset(&g_csCriticalSection,0,sizeof(g_csCriticalSection)); 00040 if (gLockCount!=0) { 00041 dkcmNOT_ASSERT("dkcThreadLockをLockした回数だけUnlockしないまま終了している"); 00042 } 00043 # ifdef DEBUG 00044 ODS("dkcLockThreadEnd\n"); 00045 # endif 00046 } 00047 00048 00050 static void Enter(){ 00051 if(FALSE==gInited){ 00052 dkcmFORCE_NOT_ASSERT("dkcThreadLockInit()で初期化していない"); 00053 return; 00054 } 00055 EnterCriticalSection(&g_csCriticalSection); 00056 00057 g_dwLockedThread = GetCurrentThreadId(); 00058 // ↑異なるスレッドからここに入ってくることはできない 00059 // (CriticalSectionの定義より) 00060 gLockCount++; 00061 00062 } 00063 00065 static void Leave(){ 00066 if(FALSE==gInited){ 00067 dkcmFORCE_NOT_ASSERT("dkcThreadLockInit()で初期化していない"); 00068 return; 00069 } 00070 if (gLockCount==0){ 00071 dkcmNOT_ASSERT("CriticalSectionManagerをEnterしていないのにLeaveしている"); 00072 } 00073 00074 if (--gLockCount==0) { 00075 g_dwLockedThread = (DWORD)-1; 00076 } 00077 // ↑Leaveした直後に他スレッドがEnterする可能性がある 00078 LeaveCriticalSection(&g_csCriticalSection); 00079 } 00080 00081 BOOL WINAPI dkcThreadLockIsLockedByThisThread(){ 00082 DWORD dw = GetCurrentThreadId(); 00083 return (g_dwLockedThread == dw); 00084 } 00085 00086 BOOL WINAPI dkcThreadLockIsInited() 00087 { 00088 return gInited; 00089 } 00090 00091 void WINAPI dkcThreadLockInit(){ 00092 Init(); 00093 } 00094 00095 void WINAPI dkcThreadLock_Lock(){ 00096 Enter(); 00097 } 00098 00099 void WINAPI dkcThreadLock_Unlock(){ 00100 Leave(); 00101 } 00102 00103 void WINAPI dkcThreadLockEnd(){ 00104 End(); 00105 }