windows-nt/Source/XPSP1/NT/net/config/netman/eapol/service/elsync.h
2020-09-26 16:20:57 +08:00

265 lines
8.1 KiB
C

/*++
Copyright (c) 2000, Microsoft Corporation
Module Name:
elsync.h
Abstract:
This module contains the declarations for providing synchronization
between multiple threads
Revision History:
mohitt, sachins, Apr 23 2000, Created
--*/
#ifndef _EAPOL_SYNC_H_
#define _EAPOL_SYNC_H_
//
// Structure: READ_WRITE_LOCK
//
typedef struct _READ_WRITE_LOCK
{
CHAR RWL_Name[4]; // overhead! but useful :)
CRITICAL_SECTION RWL_ReadWriteBlock;
LONG RWL_ReaderCount;
HANDLE RWL_ReaderDoneEvent;
} READ_WRITE_LOCK, *PREAD_WRITE_LOCK;
//
// FUNCTION DECLARATIONS
//
DWORD
CreateReadWriteLock(
OUT PREAD_WRITE_LOCK pRWL,
IN PCHAR szName);
VOID
DeleteReadWriteLock(
IN PREAD_WRITE_LOCK pRWL);
VOID
AcquireReadLock(
IN PREAD_WRITE_LOCK pRWL);
VOID
ReleaseReadLock(
IN PREAD_WRITE_LOCK pRWL);
VOID
AcquireWriteLock(
IN PREAD_WRITE_LOCK pRWL);
VOID
ReleaseWriteLock(
IN PREAD_WRITE_LOCK pRWL);
#define CREATE_READ_WRITE_LOCK(pRWL, szName) \
CreateReadWriteLock(pRWL, szName)
#define DELETE_READ_WRITE_LOCK(pRWL) \
DeleteReadWriteLock(pRWL)
#define READ_WRITE_LOCK_CREATED(pRWL) \
((pRWL)->RWL_ReaderDoneEvent != NULL)
// MACRO functions for manipulating a read-write lock
#define ACQUIRE_READ_LOCK(pRWL) \
{ \
TRACE1(LOCK, "+R: %.3s", (pRWL)->RWL_Name); \
AcquireReadLock(pRWL); \
TRACE0(LOCK, "Done."); \
}
#define RELEASE_READ_LOCK(pRWL) \
{ \
TRACE1(LOCK, "-R: %.3s", (pRWL)->RWL_Name); \
ReleaseReadLock(pRWL); \
TRACE0(LOCK, "Done."); \
}
#define ACQUIRE_WRITE_LOCK(pRWL) \
{ \
TRACE1(LOCK, "+W: %.3s", (pRWL)->RWL_Name); \
AcquireWriteLock(pRWL); \
TRACE0(LOCK, "Done."); \
}
#define RELEASE_WRITE_LOCK(pRWL) \
{ \
TRACE1(LOCK, "-W: %.3s", (pRWL)->RWL_Name); \
ReleaseWriteLock(pRWL); \
TRACE0(LOCK, "Done."); \
}
//
// MACRO functions for manipulating a dynamic read-write lock
//
#define ACQUIRE_READ_DLOCK(ppLock) \
{ \
TRACE1(LOCK, "+R: %s", LOCKSTORE->szName); \
while( \
AcquireDynamicReadwriteLock(ppLock, READ_MODE, LOCKSTORE) \
!= NO_ERROR) { Sleep(SECTOMILLISEC(DELTA)); } \
TRACE0(LOCK, "Done."); \
}
#define RELEASE_READ_DLOCK(ppLock) \
{ \
TRACE1(LOCK, "-R: %s", LOCKSTORE->szName); \
ReleaseDynamicReadwriteLock(ppLock, READ_MODE, LOCKSTORE); \
TRACE0(LOCK, "Done."); \
}
#define ACQUIRE_WRITE_DLOCK(ppLock) \
{ \
TRACE1(LOCK, "+W: %s", LOCKSTORE->szName); \
while( \
AcquireDynamicReadwriteLock(ppLock, WRITE_MODE, LOCKSTORE) \
!= NO_ERROR) { Sleep(SECTOMILLISEC(DELTA)); } \
TRACE0(LOCK, "Done."); \
}
#define RELEASE_WRITE_DLOCK(ppLock) \
{ \
TRACE1(LOCK, "-W: %s", LOCKSTORE->szName); \
ReleaseDynamicReadwriteLock(ppLock, WRITE_MODE, LOCKSTORE); \
TRACE0(LOCK, "Done."); \
}
//
// STRUCTURE: LOCKED_LIST
// type definition for generic locked list
// access is sychronized with a critical section
//
typedef struct _LOCKED_LIST
{
CHAR name[4];
CRITICAL_SECTION lock;
LIST_ENTRY head;
DWORD created;
} LOCKED_LIST, *PLOCKED_LIST;
#define INITIALIZE_LOCKED_LIST(pLL, szName) \
{ \
do \
{ \
sprintf((pLL)->name, "%.3s", szName); \
__try { \
InitializeCriticalSection(&((pLL)->lock)); \
} \
__except (EXCEPTION_EXECUTE_HANDLER) { \
break; \
} \
InitializeListHead(&((pLL)->head)); \
(pLL)->created = 0x12345678; \
} while (FALSE); \
}
#define LOCKED_LIST_INITIALIZED(pLL) \
((pLL)->created == 0x12345678)
#define DELETE_LOCKED_LIST(pLL, FreeFunction) \
{ \
(pLL)->created = 0; \
FreeList(&((pLL)->head), FreeFunction); \
DeleteCriticalSection(&(pLL)->lock); \
}
#define AcquireListLock(pLL) EnterCriticalSection(&(pLL)->lock)
#define ReleaseListLock(pLL) LeaveCriticalSection(&(pLL)->lock)
#define LOCKED_QUEUE LOCKED_LIST
#define PLOCKED_QUEUE PLOCKED_LIST
#define INITIALIZE_LOCKED_QUEUE(pLQ, szName) \
INITIALIZE_LOCKED_LIST(pLQ, szName)
#define LOCKED_QUEUE_INITIALIZED(pLQ) \
LOCKED_LIST_INITIALIZED(pLQ)
#define DELETE_LOCKED_QUEUE(pLQ, FreeFunction) \
DELETE_LOCKED_LIST(pLQ, FreeFunction)
//
// STRUCTURE: DYNAMIC_READWRITE_LOCK
//
typedef struct _DYNAMIC_READWRITE_LOCK
{
READ_WRITE_LOCK rwlLock;
union
{
ULONG ulCount; // number of waiting threads
LIST_ENTRY leLink; // link in list of free locks
};
} DYNAMIC_READWRITE_LOCK, *PDYNAMIC_READWRITE_LOCK;
//
// STRUCTURE: DYNAMIC_LOCKS_STORE
// store of free dynamic locks that can be allocated as required.
//
typedef struct _DYNAMIC_LOCKS_STORE
{
CHAR szName[4];
HANDLE hHeap;
LOCKED_LIST llFreeLocksList;
ULONG ulCountAllocated;
ULONG ulCountFree;
} DYNAMIC_LOCKS_STORE, *PDYNAMIC_LOCKS_STORE;
// if more than DYNAMIC_LOCKS_HIGH_THRESHOLD locks are
// allocated then any locks that are freed are destroyed
#define DYNAMIC_LOCKS_HIGH_THRESHOLD 7
#define DYNAMIC_LOCKS_STORE_INITIALIZED(pStore) \
(LOCKED_LIST_INITIALIZED(&(pStore)->llFreeLocksList))
typedef enum { READ_MODE, WRITE_MODE } LOCK_MODE;
DWORD
InitializeDynamicLocksStore (
PDYNAMIC_LOCKS_STORE pStore,
HANDLE hHeap,
PCHAR szName
);
DWORD
DeInitializeDynamicLocksStore (
PDYNAMIC_LOCKS_STORE pStore
);
DWORD
AcquireDynamicReadwriteLock (
PDYNAMIC_READWRITE_LOCK *ppLock,
LOCK_MODE lmMode,
PDYNAMIC_LOCKS_STORE pStore
);
VOID
ReleaseDynamicReadwriteLock (
PDYNAMIC_READWRITE_LOCK *ppLock,
LOCK_MODE lmMode,
PDYNAMIC_LOCKS_STORE pStore
);
#endif // _EAPOL_SYNC_H