163 lines
3.8 KiB
C
163 lines
3.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
lock.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module defines the data structures and function prototypes used
|
||
|
for spin lock debugging.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Manny Weiser (mannyw) 18-Jan-1992
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _LOCK_
|
||
|
#define _LOCK_
|
||
|
|
||
|
#if MUPDBG
|
||
|
|
||
|
#define MUP_TEB_LOCK_LIST 0
|
||
|
|
||
|
#define INITIALIZE_LOCK( lock, level, name ) \
|
||
|
MupInitializeLock( (lock), (level), (name) )
|
||
|
#define DELETE_LOCK( lock ) MupDeleteLock( lock )
|
||
|
|
||
|
#define ACQUIRE_LOCK(lock) MupAcquireLock( lock )
|
||
|
#define RELEASE_LOCK(lock) MupReleaseLock( lock )
|
||
|
#define LOCK_NAME( lock ) ((lock)->Header.LockName)
|
||
|
#define LOCK_LEVEL( lock ) ((lock)->Header.LockLevel)
|
||
|
#define LOCK_THREAD_LIST( lock ) (&((lock)->Header.ThreadListEntry))
|
||
|
|
||
|
#define LOCK_NUMBER_OF_ACTIVE( lock ) ((lock)->Resource.ActiveCount)
|
||
|
#define LOCK_EXCLUSIVE_OWNER( lock ) ((ULONG)(lock)->Resource.OwnerThreads[0].OwnerThread)
|
||
|
|
||
|
//
|
||
|
// MUP_LOCK_HEADER is a structure that contains debugging information
|
||
|
// used by the server lock package. Mup spin locks contain a
|
||
|
// MUP_LOCK_HEADER.
|
||
|
//
|
||
|
|
||
|
typedef struct _MUP_LOCK_HEADER {
|
||
|
|
||
|
//
|
||
|
// To prevent deadlocks, locks are assigned level numbers. If a
|
||
|
// thread holds a lock with level N, it may only acquire new locks
|
||
|
// with a level greater then N. Level numbers are assigned during
|
||
|
// lock initialization.
|
||
|
//
|
||
|
|
||
|
ULONG LockLevel;
|
||
|
|
||
|
//
|
||
|
// A doubly-linked list of all the locks owned by a thread is stored
|
||
|
// in a thread's TEB. The list is in order of lock level (from
|
||
|
// highest to lowest), which is also, by definition of lock levels,
|
||
|
// the order in which the thread acquired the locks. This allows
|
||
|
// the thread to release the locks in any order while maintaining
|
||
|
// easy access to the highest-level lock that the thread owns,
|
||
|
// thereby providing a mechanism for ensuring that locks are
|
||
|
// acquired in increasing order.
|
||
|
//
|
||
|
|
||
|
LIST_ENTRY ThreadListEntry;
|
||
|
|
||
|
//
|
||
|
// The symbolic name of the lock is used in DbgPrint calls.
|
||
|
//
|
||
|
|
||
|
PSZ LockName;
|
||
|
|
||
|
} MUP_LOCK_HEADER, *PMUP_LOCK_HEADER;
|
||
|
|
||
|
//
|
||
|
// When debugging is enabled, a server lock is a wrapper around an
|
||
|
// executive resource.
|
||
|
//
|
||
|
|
||
|
typedef struct _MUP_LOCK {
|
||
|
|
||
|
//
|
||
|
// The MUP_LOCK_HEADER must appear first!
|
||
|
//
|
||
|
|
||
|
MUP_LOCK_HEADER Header;
|
||
|
|
||
|
//
|
||
|
// The actual "lock" is maintained by the resource package.
|
||
|
//
|
||
|
|
||
|
ERESOURCE Resource;
|
||
|
|
||
|
} MUP_LOCK, *PMUP_LOCK;
|
||
|
|
||
|
VOID
|
||
|
MupInitializeLock(
|
||
|
IN PMUP_LOCK Lock,
|
||
|
IN ULONG Locklevel,
|
||
|
IN PSZ LockName
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
MupDeleteLock (
|
||
|
IN PMUP_LOCK Lock
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
MupAcquireLock(
|
||
|
IN PMUP_LOCK Lock
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
MupReleaseLock(
|
||
|
IN PMUP_LOCK Lock
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
MupCheckListIntegrity (
|
||
|
IN PLIST_ENTRY ListHead,
|
||
|
IN ULONG MaxEntries
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Macros that define locations in the UserReserved field of the TEB
|
||
|
// where lock level information is stored.
|
||
|
//
|
||
|
|
||
|
#define MUP_TEB_LOCK_LIST 0
|
||
|
#define MUP_TEB_LOCK_INIT 2
|
||
|
#define MUP_TEB_USER_SIZE (3 * sizeof(ULONG))
|
||
|
|
||
|
//
|
||
|
// Levels used for spin locks used in the MUP. Locks can be acquired
|
||
|
// only in increasing lock level order. Be careful when adding a new
|
||
|
// lock or when changing the order of lock levels.
|
||
|
//
|
||
|
|
||
|
#define GLOBAL_LOCK_LEVEL (ULONG)0x80000100
|
||
|
#define PREFIX_TABLE_LOCK_LEVEL (ULONG)0x80000200
|
||
|
#define CCB_LIST_LOCK_LEVEL (ULONG)0x80000300
|
||
|
#define QUERY_CONTEXT_LOCK_LEVEL (ULONG)0x80000400
|
||
|
#define DEBUG_LOCK_LEVEL (ULONG)0x80000500
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define INITIALIZE_LOCK( lock, level, name ) ExInitializeResourceLite( (lock) )
|
||
|
#define DELETE_LOCK( lock ) ExDeleteResourceLite( (lock) )
|
||
|
#define ACQUIRE_LOCK( lock ) \
|
||
|
ExAcquireResourceExclusiveLite( (lock), TRUE )
|
||
|
#define RELEASE_LOCK(lock) ExReleaseResourceLite( (lock) )
|
||
|
|
||
|
typedef ERESOURCE MUP_LOCK, *PMUP_LOCK;
|
||
|
#endif // MUPDBG
|
||
|
|
||
|
#endif // _LOCK_
|
||
|
|