メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# dkcThreadLock.c

説明を見る。

    00001
    00008 #define DKUTIL_C_THREAD_LOCK_C
    00009
    00010 #include "dkcThreadLock.h"
    00011 #include "dkcStdio.h"
    00012
    00013
    00014
    00015 DKC_THREAD_LOCK * WINAPI dkcAllocThreadLock(){
    00016     DKC_THREAD_LOCK *p = (DKC_THREAD_LOCK *)dkcAllocate(sizeof(DKC_THREAD_LOCK));
    00017     if(NULL==p){
    00018         return NULL;
    00019     }
    00020     InitializeCriticalSection(&(p->m_csCriticalSection));
    00021     p->m_dwLockedThread = (DWORD)-1;
    00022     p->mLockCount   = 0;
    00023
    00024     return p;
    00025 }
    00026
    00027 int WINAPI dkcFreeThreadLock(DKC_THREAD_LOCK **pp){
    00028     if(NULL==pp || NULL==*pp){
    00029         return edk_ArgumentException;
    00030     }
    00031
    00032     DeleteCriticalSection(&((*pp)->m_csCriticalSection));
    00033
    00034     if ((*pp)->mLockCount!=0) {
    00035         dkcmFORCE_NOT_ASSERT("dkcThreadLockをLockした回数だけUnlockしないまま終了している");
    00036     }
    00037     return dkcFree((void **)pp);
    00038 }
    00039
    00040 void WINAPI dkcThreadLock_Lock(DKC_THREAD_LOCK *p){
    00041     dkcmFORCE_NOT_ASSERT(NULL==p);
    00042
    00043     EnterCriticalSection(&(p->m_csCriticalSection));
    00044
    00045     p->m_dwLockedThread = GetCurrentThreadId();
    00046     //  ↑異なるスレッドからここに入ってくることはできない
    00047     //  (CriticalSectionの定義より)
    00048     p->mLockCount++;
    00049 }
    00050
    00051
    00052 void WINAPI dkcThreadLock_Unlock(DKC_THREAD_LOCK *p){
    00053     dkcmFORCE_NOT_ASSERT(NULL==p);
    00054
    00055     if (p->mLockCount==0){
    00056         dkcmNOT_ASSERT("CriticalSectionManagerをEnterしていないのにLeaveしている");
    00057     }
    00058
    00059     if ((--(p->mLockCount))==0) {
    00060         p->m_dwLockedThread = (DWORD)-1;
    00061     }
    00062     //  ↑Leaveした直後に他スレッドがEnterする可能性がある
    00063     LeaveCriticalSection(&(p->m_csCriticalSection));
    00064 }
    00065
    00066 /*
    00067 BOOL WINAPI dkcThreadLockIsInited(DKC_THREAD_LOCK *){
    00068
    00069 }
    00070 */
    00071 BOOL WINAPI dkcThreadLockIsLockedByThisThread(DKC_THREAD_LOCK *p)
    00072 {
    00073     DWORD dw;
    00074
    00075     dkcmFORCE_NOT_ASSERT(NULL==p);
    00076
    00077     dw = GetCurrentThreadId();
    00078     return (p->m_dwLockedThread == dw);
    00079 }
    00080
    00081
    00082 /*
    00083 static CRITICAL_SECTION g_csCriticalSection;
    00084 static DWORD                g_dwLockedThread = 0;   //  LockしているThreadId(0:非Lock)
    00085 static int                  gLockCount = 0;     //  Lockされている回数
    00086     //  (同一スレッドならば複数回Lockできるので)
    00087 //初期化しているかどうかフラグ。
    00088 static BOOL gInited = FALSE;
    00089
    00090
    00091
    00092 static void Init(){
    00093     {
    00094         if(TRUE==gInited){return;}
    00095     }
    00096     InitializeCriticalSection(&g_csCriticalSection);
    00097     g_dwLockedThread = (DWORD)-1;
    00098     gLockCount  = 0;
    00099 #   ifdef DEBUG
    00100     ODS("dkcLockThreadInit\n");
    00101 #   endif
    00102     gInited = TRUE;
    00103 }
    00104
    00105 static void End(){
    00106     {
    00107         if(FALSE==gInited){return;}
    00108     }
    00109     DeleteCriticalSection(&g_csCriticalSection);
    00110     gInited = FALSE;
    00111     memset(&g_csCriticalSection,0,sizeof(g_csCriticalSection));
    00112     if (gLockCount!=0) {
    00113         dkcmNOT_ASSERT("dkcThreadLockをLockした回数だけUnlockしないまま終了している");
    00114     }
    00115 #   ifdef DEBUG
    00116     ODS("dkcLockThreadEnd\n");
    00117 #   endif
    00118 }
    00119
    00120
    00122 static void Enter(){
    00123     if(FALSE==gInited){
    00124         dkcmFORCE_NOT_ASSERT("dkcThreadLockInit()で初期化していない");
    00125         return;
    00126     }
    00127     EnterCriticalSection(&g_csCriticalSection);
    00128
    00129     g_dwLockedThread = GetCurrentThreadId();
    00130     //  ↑異なるスレッドからここに入ってくることはできない
    00131     //  (CriticalSectionの定義より)
    00132     gLockCount++;
    00133
    00134 }
    00135
    00137 static void Leave(){
    00138     if(FALSE==gInited){
    00139         dkcmFORCE_NOT_ASSERT("dkcThreadLockInit()で初期化していない");
    00140         return;
    00141     }
    00142     if (gLockCount==0){
    00143         dkcmNOT_ASSERT("CriticalSectionManagerをEnterしていないのにLeaveしている");
    00144     }
    00145
    00146     if (--gLockCount==0) {
    00147         g_dwLockedThread = (DWORD)-1;
    00148     }
    00149     //  ↑Leaveした直後に他スレッドがEnterする可能性がある
    00150     LeaveCriticalSection(&g_csCriticalSection);
    00151 }
    00152
    00153 BOOL WINAPI dkcThreadLockIsLockedByThisThread(){
    00154     DWORD dw = GetCurrentThreadId();
    00155     return (g_dwLockedThread == dw);
    00156 }
    00157
    00158 BOOL WINAPI dkcThreadLockIsInited()
    00159 {
    00160     return gInited;
    00161 }
    00162
    00163 void WINAPI dkcThreadLockInit(){
    00164     Init();
    00165 }
    00166
    00167 void WINAPI dkcThreadLock_Lock(){
    00168     Enter();
    00169 }
    00170
    00171 void WINAPI dkcThreadLock_Unlock(){
    00172     Leave();
    00173 }
    00174
    00175 void WINAPI dkcThreadLockEnd(){
    00176     End();
    00177 }
    00178 */