#include "dkcThreadLock.h"
#include "dkcStdio.h"
dkcThreadLock.cのインクルード依存関係図
マクロ定義 | |
#define | DKUTIL_C_THREAD_LOCK_C |
関数 | |
DKC_THREAD_LOCK *WINAPI | dkcAllocThreadLock () |
int WINAPI | dkcFreeThreadLock (DKC_THREAD_LOCK **pp) |
void WINAPI | dkcThreadLock_Lock (DKC_THREAD_LOCK *p) |
void WINAPI | dkcThreadLock_Unlock (DKC_THREAD_LOCK *p) |
BOOL WINAPI | dkcThreadLockIsLockedByThisThread (DKC_THREAD_LOCK *p) |
dkcThreadLock.c で定義されています。
|
dkcThreadLock.c の 8 行で定義されています。 |
|
dkcThreadLock.c の 15 行で定義されています。 参照先 dkcAllocate(), dkcdINVALID_THREAD_ID, dkc_ThreadLock::mLockCount, dkc_ThreadLock::mLockedThread, dkc_ThreadLock::mMutex, と NULL. 参照元 dkcFileCopyEx(). 00015 { 00016 DKC_THREAD_LOCK *p = (DKC_THREAD_LOCK *)dkcAllocate(sizeof(DKC_THREAD_LOCK)); 00017 if(NULL==p){ 00018 return NULL; 00019 } 00020 #ifdef WIN32 00021 InitializeCriticalSection(&(p->m_csCriticalSection)); 00022 00023 #else 00024 pthread_mutex_init(&(p->mMutex), NULL); // POSIX 00025 00026 #endif 00027 p->mLockedThread = dkcdINVALID_THREAD_ID; 00028 p->mLockCount = 0; 00029 00030 return p; 00031 }
|
|
dkcThreadLock.c の 33 行で定義されています。 参照先 dkcFree(), dkcmFORCE_NOT_ASSERT, dkcmNOT_ASSERT, dkcThreadLock_Unlock(), と NULL. 参照元 dkcFileCopyEx(). 00033 { 00034 const char *asstr = "dkcThreadLockをLockした回数だけUnlockしないまま終了している"; 00035 if(NULL==pp || NULL==*pp){ 00036 return edk_ArgumentException; 00037 } 00038 if ((*pp)->mLockCount!=0) { 00039 int i; 00040 dkcmNOT_ASSERT(asstr); 00041 for(i=0;i<(*pp)->mLockCount;i++){ 00042 dkcThreadLock_Unlock((*pp)); 00043 } 00044 } 00045 #ifdef WIN32 00046 DeleteCriticalSection(&((*pp)->m_csCriticalSection)); 00047 #else 00048 pthread_mutex_destroy(&((*pp)->mMutex)); 00049 #endif 00050 if ((*pp)->mLockCount!=0) { 00051 dkcmFORCE_NOT_ASSERT(asstr); 00052 } 00053 return dkcFree((void **)pp); 00054 }
|
|
dkcThreadLock.c の 56 行で定義されています。 参照先 dkcGetThreadID(), dkcmFORCE_NOT_ASSERT, dkc_ThreadLock::mLockCount, dkc_ThreadLock::mLockedThread, dkc_ThreadLock::mMutex, と NULL. 参照元 dkcFileCopyEx(). 00056 { 00057 dkcmFORCE_NOT_ASSERT(NULL==p); 00058 #ifdef WIN32 00059 EnterCriticalSection(&(p->m_csCriticalSection)); 00060 // ↑異なるスレッドからここに入ってくることはできない 00061 // (CriticalSectionの定義より) 00062 #else 00063 pthread_mutex_lock(&(p->mMutex)); 00064 00065 #endif 00066 p->mLockedThread = dkcGetThreadID(); 00067 00068 p->mLockCount++; 00069 }
|
|
dkcThreadLock.c の 72 行で定義されています。 参照先 dkcdINVALID_THREAD_ID, dkcmFORCE_NOT_ASSERT, dkcmNOT_ASSERT, dkc_ThreadLock::mLockCount, dkc_ThreadLock::mLockedThread, dkc_ThreadLock::mMutex, と NULL. 参照元 dkcFileCopyEx(), と dkcFreeThreadLock(). 00072 { 00073 dkcmFORCE_NOT_ASSERT(NULL==p); 00074 00075 if (p->mLockCount==0){ 00076 dkcmNOT_ASSERT("CriticalSectionManagerをEnterしていないのにLeaveしている"); 00077 } 00078 00079 if ((--(p->mLockCount))==0) { 00080 p->mLockedThread = dkcdINVALID_THREAD_ID; 00081 } 00082 #ifdef WIN32 00083 // ↑Leaveした直後に他スレッドがEnterする可能性がある 00084 LeaveCriticalSection(&(p->m_csCriticalSection)); 00085 #else 00086 pthread_mutex_unlock(&(p->mMutex)); 00087 #endif 00088 }
|
|
dkcThreadLock.c の 95 行で定義されています。 参照先 dkcGetThreadID(), dkcmFORCE_NOT_ASSERT, dkc_ThreadLock::mLockedThread, と NULL. 00096 { 00097 dkctThreadID dw; 00098 00099 dkcmFORCE_NOT_ASSERT(NULL==p); 00100 dw = dkcGetThreadID(); 00101 00102 return (p->mLockedThread == dw); 00103 }
|