97 lines
1.9 KiB
C
97 lines
1.9 KiB
C
/*
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
swmr.h
|
||
|
||
Abstract:
|
||
|
||
This module contains the Single writer-Multi reader access structures
|
||
Also the lock-list-count structures.
|
||
|
||
Author:
|
||
|
||
Jameel Hyder (microsoft!jameelh)
|
||
|
||
|
||
Revision History:
|
||
25 Apr 1992 Initial Version
|
||
|
||
Notes: Tab stop: 4
|
||
--*/
|
||
|
||
#ifndef _SWMR_
|
||
#define _SWMR_
|
||
|
||
#if DBG
|
||
#define SWMR_SIGNATURE *(DWORD *)"SWMR"
|
||
#define VALID_SWMR(pSwmr) (((pSwmr) != NULL) && \
|
||
((pSwmr)->Signature == SWMR_SIGNATURE))
|
||
#else
|
||
#define VALID_SWMR(pSwmr) ((pSwmr) != NULL)
|
||
#endif
|
||
|
||
#define SWMR_SOMEONE_WAITING( _pSwmr ) ((_pSwmr)->swmr_cExclWaiting || \
|
||
(_pSwmr)->swmr_cSharedWaiting)
|
||
typedef struct _SingleWriterMultiReader
|
||
{
|
||
#if DBG
|
||
DWORD Signature;
|
||
#endif
|
||
BYTE swmr_cOwnedExclusive; // # of times a single thread has owned it exclusively
|
||
BYTE swmr_cExclWaiting; // Number of writers waiting
|
||
BYTE swmr_cSharedOwners; // Count of threads owning shared access
|
||
BYTE swmr_cSharedWaiting; // Count of threads waiting for shared access
|
||
PETHREAD swmr_ExclusiveOwner; // Owning thread for exclusive access
|
||
KSEMAPHORE swmr_ExclSem; // semaphore for Exclusive owners
|
||
KSEMAPHORE swmr_SharedSem; // Semaphore for Shared owners
|
||
} SWMR, *PSWMR;
|
||
|
||
extern
|
||
VOID FASTCALL
|
||
AfpSwmrInitSwmr(
|
||
IN OUT PSWMR pSwmr
|
||
);
|
||
|
||
extern
|
||
VOID FASTCALL
|
||
AfpSwmrAcquireShared(
|
||
IN PSWMR pSwmr
|
||
);
|
||
|
||
VOID FASTCALL
|
||
AfpSwmrAcquireExclusive(
|
||
IN PSWMR pSwmr
|
||
);
|
||
|
||
extern
|
||
VOID FASTCALL
|
||
AfpSwmrRelease(
|
||
IN PSWMR pSwmr
|
||
);
|
||
|
||
extern
|
||
BOOLEAN FASTCALL
|
||
AfpSwmrUpgradeToExclusive(
|
||
IN PSWMR pSwmr
|
||
);
|
||
|
||
extern
|
||
VOID FASTCALL
|
||
AfpSwmrDowngradeToShared(
|
||
IN PSWMR pSwmr
|
||
);
|
||
|
||
#define AfpSwmrLockedShared(pSwmr) \
|
||
(((pSwmr)->swmr_cSharedOwners != 0) && \
|
||
((pSwmr)->swmr_cOwnedExclusive == 0))
|
||
|
||
#define AfpSwmrLockedExclusive(pSwmr) \
|
||
(((pSwmr)->swmr_cOwnedExclusive != 0) && \
|
||
((pSwmr)->swmr_ExclusiveOwner == PsGetCurrentThread()))
|
||
|
||
#endif // _SWMR_
|
||
|
||
|