メインページ | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcThreadLock.c

説明を見る。
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 }

dkutil_cに対してSun Jul 18 22:45:22 2004に生成されました。 doxygen 1.3.6