83 lines
3.4 KiB
C
83 lines
3.4 KiB
C
|
//============================================================================
|
||
|
// Copyright (c) 1995, Microsoft Corporation
|
||
|
//
|
||
|
// File: sync.h
|
||
|
//
|
||
|
// History:
|
||
|
// Abolade Gbadegesin September-8-1995 Created.
|
||
|
//
|
||
|
// Contains structures and macros used to implement synchronization.
|
||
|
//============================================================================
|
||
|
|
||
|
#ifndef _SYNC_H_
|
||
|
#define _SYNC_H_
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// struct: READ_WRITE_LOCK
|
||
|
//
|
||
|
// This implements a multiple-reader/single-writer locking scheme
|
||
|
//
|
||
|
typedef RTL_RESOURCE READ_WRITE_LOCK, *PREAD_WRITE_LOCK;
|
||
|
|
||
|
#define CREATE_READ_WRITE_LOCK(pRWL) \
|
||
|
RtlInitializeResource((pRWL))
|
||
|
#define DELETE_READ_WRITE_LOCK(pRWL) \
|
||
|
RtlDeleteResource((pRWL))
|
||
|
#define READ_WRITE_LOCK_CREATED(pRWL) (TRUE)
|
||
|
#define ACQUIRE_READ_LOCK(pRWL) \
|
||
|
RtlAcquireResourceShared((pRWL),TRUE)
|
||
|
#define RELEASE_READ_LOCK(pRWL) \
|
||
|
RtlReleaseResource((pRWL))
|
||
|
#define ACQUIRE_WRITE_LOCK(pRWL) \
|
||
|
RtlAcquireResourceExclusive((pRWL),TRUE)
|
||
|
#define RELEASE_WRITE_LOCK(pRWL) \
|
||
|
RtlReleaseResource((pRWL))
|
||
|
#define READ_LOCK_TO_WRITE_LOCK(pRWL) \
|
||
|
RtlConvertSharedToExclusive((pRWL))
|
||
|
#define WRITE_LOCK_TO_READ_LOCK(pRWL) \
|
||
|
RtlConvertExclusiveToShared((pRWL))
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
// struct: LOCKED_LIST
|
||
|
//
|
||
|
// type definition for generic locked list
|
||
|
// access is sychronized with a critical section
|
||
|
// the LIST_ENTRY field must be the first field in structs linked
|
||
|
// together by this construct, in order for the destruction of the
|
||
|
// list to work correctly (i.e. in order for HeapFree(RemoveHeadList(l))
|
||
|
// to free the correct pointer).
|
||
|
//
|
||
|
typedef struct _LOCKED_LIST {
|
||
|
LIST_ENTRY LL_Head;
|
||
|
CRITICAL_SECTION LL_Lock;
|
||
|
DWORD LL_Created;
|
||
|
} LOCKED_LIST, *PLOCKED_LIST;
|
||
|
|
||
|
// macro functions for manipulating the locked list
|
||
|
//
|
||
|
#define CREATE_LOCKED_LIST(pLL) \
|
||
|
InitializeListHead(&(pLL)->LL_Head); \
|
||
|
InitializeCriticalSection(&(pLL)->LL_Lock); \
|
||
|
(pLL)->LL_Created = 0x12345678
|
||
|
#define LOCKED_LIST_CREATED(pLL) \
|
||
|
((pLL)->LL_Created == 0x12345678)
|
||
|
#define DELETE_LOCKED_LIST(pLL) { \
|
||
|
PLIST_ENTRY _ple; \
|
||
|
(pLL)->LL_Created = 0; \
|
||
|
DeleteCriticalSection(&(pLL)->LL_Lock); \
|
||
|
while (!IsListEmpty(&(pLL)->LL_Head)) { \
|
||
|
_ple = RemoveHeadList(&(pLL)->LL_Head); \
|
||
|
BOOTP_FREE(_ple); \
|
||
|
} \
|
||
|
}
|
||
|
#define ACQUIRE_LIST_LOCK(pLL) \
|
||
|
EnterCriticalSection(&(pLL)->LL_Lock)
|
||
|
#define RELEASE_LIST_LOCK(pLL) \
|
||
|
LeaveCriticalSection(&(pLL)->LL_Lock)
|
||
|
|
||
|
|
||
|
#endif // _SYNC_H_
|
||
|
|