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

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 */

dkutil_cに対してSat Sep 10 09:23:57 2005に生成されました。  doxygen 1.4.4