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

dkcThreadLock.h

スレッドのロック(CRITICAL_SECTION,pthread_mutex_t) [詳細]

#include "dkcOSIndependent.h"

dkcThreadLock.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

構成

struct  dkc_ThreadLock

マクロ定義

#define dkcdINVALID_THREAD_ID   ((dkctThreadID)(NULL))
#define dkcThreadLockIsLockedByCurrentThread(p)   dkcThreadLockIsLockedByThisThread(p)

型定義

typedef void * dkctThreadID
typedef dkc_ThreadLock DKC_THREAD_LOCK

関数

DKC_INLINE dkctThreadID dkcGetThreadID ()
DKC_EXTERN DKC_THREAD_LOCK
*WINAPI 
dkcAllocThreadLock ()
DKC_EXTERN int WINAPI dkcFreeThreadLock (DKC_THREAD_LOCK **)
DKC_EXTERN void WINAPI dkcThreadLock_Lock (DKC_THREAD_LOCK *)
DKC_EXTERN void WINAPI dkcThreadLock_Unlock (DKC_THREAD_LOCK *)
DKC_EXTERN BOOL WINAPI dkcThreadLockIsLockedByThisThread (DKC_THREAD_LOCK *)


説明

スレッドのロック(CRITICAL_SECTION,pthread_mutex_t)

作者:
d金魚
から:
2004/3/22
覚え書き:
Critical SectionのWrapper <s>いずれmulti platformにしたい</s> 2005/12/31にPOSIX?に対応、pthreadを使えるようにしたけどコンパイルできるかどうかは不明

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


マクロ定義

#define dkcdINVALID_THREAD_ID   ((dkctThreadID)(NULL))
 

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

参照元 dkcAllocThreadLock(), と dkcThreadLock_Unlock().

#define dkcThreadLockIsLockedByCurrentThread  )     dkcThreadLockIsLockedByThisThread(p)
 

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


型定義

typedef struct dkc_ThreadLock DKC_THREAD_LOCK
 

typedef void* dkctThreadID
 

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


関数

DKC_EXTERN DKC_THREAD_LOCK* WINAPI dkcAllocThreadLock  ) 
 

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

参照先 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 }

DKC_EXTERN int WINAPI dkcFreeThreadLock DKC_THREAD_LOCK **   ) 
 

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

参照先 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 }

DKC_INLINE dkctThreadID dkcGetThreadID  ) 
 

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

参照元 dkcThreadLock_Lock(), と dkcThreadLockIsLockedByThisThread().

00046                                         {
00047 #ifdef WIN32
00048     return GetCurrentThreadId();
00049 #else
00050     return pthread_self();
00051 #endif
00052 }

DKC_EXTERN void WINAPI dkcThreadLock_Lock DKC_THREAD_LOCK  ) 
 

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

参照先 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 }

DKC_EXTERN void WINAPI dkcThreadLock_Unlock DKC_THREAD_LOCK  ) 
 

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

参照先 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 }

DKC_EXTERN BOOL WINAPI dkcThreadLockIsLockedByThisThread DKC_THREAD_LOCK  ) 
 

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

参照先 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 }


dkutil_cに対してMon Jan 16 00:46:44 2006に生成されました。  doxygen 1.4.4