You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.0 KiB
97 lines
2.0 KiB
/*
|
|
|
|
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_
|
|
|
|
|