265 lines
8.1 KiB
C
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
|