Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CRITICAL_SECTION構造体

タグ: VS2005 C++

CRITICAL_SECTIONのデッドロック箇所を特定する方法を探していたところ、CRITICAL_SECTION自体がそこそこ情報を持っていることに気付いたのでメモ。

Windows CE 5.0 SDK

typedef struct CRITICAL_SECTION {
    unsigned int LockCount;         /* Nesting count on critical section */
    HANDLE OwnerThread;         	/* Handle of owner thread */
    HANDLE hCrit;					/* Handle to this critical section */
    DWORD needtrap;					/* Trap in when freeing critical section */
    DWORD dwContentions;			/* Count of contentions */
} CRITICAL_SECTION, *LPCRITICAL_SECTION;
LockCount
EnterCriticalSection のネスト深度。
初期値は1で、OwnerThreadがNULLでも0にはならない。
OwnerThread
クリティカルセクションオブジェクトを所有している(ロックしている)スレッド。
どのスレッドも所有していないときはNULL。
hCrit
クリティカルセクションオブジェクトハンドル。
needtrap
待機スレッドの有無。
dwContentions
クリティカルセクションオブジェクトを所有するためにスレッドが待機状態になった回数。

Visual Studio 2005 Platform SDK

typedef struct _RTL_CRITICAL_SECTION_DEBUG {
    WORD   Type;
    WORD   CreatorBackTraceIndex;
    struct _RTL_CRITICAL_SECTION *CriticalSection;
    LIST_ENTRY ProcessLocksList;
    DWORD EntryCount;
    DWORD ContentionCount;
    DWORD Spare[ 2 ];
} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;

#define RTL_CRITSECT_TYPE 0
#define RTL_RESOURCE_TYPE 1

typedef struct _RTL_CRITICAL_SECTION {
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;

    //
    //  The following three fields control entering and exiting the critical
    //  section for the resource
    //

    LONG LockCount;
    LONG RecursionCount;
    HANDLE OwningThread;        // from the thread's ClientId->UniqueThread
    HANDLE LockSemaphore;
    ULONG_PTR SpinCount;        // force size on 64-bit systems when packed
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

こちらはMSDN Magazineに詳しい説明あり
DebugInfoとか、名前を見て「デバッグ用の詳細情報か?」と期待したら、なんか普通にリリース版でも必要なものらしい。
ちょっとがっかり。

Type
0
CreatorBackTraceIndex
よく分からない。
ProcessLocksList
プロセスにある全てのクリティカルセクションを繋ぐリスト?
EntryCount
ContentionCount
クリティカルセクションオブジェクトを所有するためにスレッドが待機状態になった回数。
Spare
自由に使っていい?
LockCount
ロックされていない = -1
ロックされている = RecursionCount - 1 + 待機スレッド数
RecursionCount
EnterCriticalSection のネスト深度。
ロックされていないか、 LeaveCriticalSection で所有権を完全に手放した直後は0。
OwningThread
クリティカルセクションオブジェクトを所有している(ロックしている)スレッド。
どのスレッドも所有していないときはNULL。
LockSemaphore
CreateEvent(0, TRUE, FALSE, 0) みたいなもの。
スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/123-60ace247
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。