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

# dkcThreadLock.c

`#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)

## 説明

作者:
  d金魚

から:
  2004/3/xx

dkcThreadLock.c で定義されています。

## マクロ定義

#define DKUTIL_C_THREAD_LOCK_C

| dkcThreadLock.c の 8 行で定義されています。

## 関数

DKC_THREAD_LOCK* WINAPI dkcAllocThreadLock | ( |  | ) |

| 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 }

int WINAPI dkcFreeThreadLock | ( | DKC_THREAD_LOCK ** | pp | ) |

| 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 }

void WINAPI dkcThreadLock_Lock | ( | DKC_THREAD_LOCK * | p | ) |

| 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 }

void WINAPI dkcThreadLock_Unlock | ( | DKC_THREAD_LOCK * | p | ) |

| 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 }

BOOL WINAPI dkcThreadLockIsLockedByThisThread | ( | DKC_THREAD_LOCK * | p | ) |

| 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 }