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

# 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(), DWORD, と 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     InitializeCriticalSection(&(p->m_csCriticalSection));
    00021     p->m_dwLockedThread = (DWORD)-1;
    00022     p->mLockCount   = 0;
    00023
    00024     return p;
    00025 }

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

| dkcThreadLock.c の 27 行で定義されています。 参照先 dkcFree(), dkcmFORCE_NOT_ASSERT, と NULL. 参照元 dkcFileCopyEx().
    00027                                                   {
    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 }

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

| dkcThreadLock.c の 40 行で定義されています。 参照先 dkcmFORCE_NOT_ASSERT, と NULL. 参照元 dkcFileCopyEx().
    00040                                                   {
    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 }

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

| dkcThreadLock.c の 52 行で定義されています。 参照先 dkcmFORCE_NOT_ASSERT, dkcmNOT_ASSERT, DWORD, と NULL. 参照元 dkcFileCopyEx().
    00052                                                     {
    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 }

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

| dkcThreadLock.c の 71 行で定義されています。 参照先 dkcmFORCE_NOT_ASSERT, DWORD, と NULL.
    00072 {
    00073     DWORD dw;
    00074
    00075     dkcmFORCE_NOT_ASSERT(NULL==p);
    00076
    00077     dw = GetCurrentThreadId();
    00078     return (p->m_dwLockedThread == dw);
    00079 }