119 lines
2.2 KiB
C
119 lines
2.2 KiB
C
/*++
|
|
|
|
Copyright(c) 1999-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
brdgwait.h
|
|
|
|
Abstract:
|
|
|
|
Ethernet MAC level bridge
|
|
WAIT_REFCOUNT implementation
|
|
|
|
Author:
|
|
|
|
Mark Aiken
|
|
|
|
Environment:
|
|
|
|
Kernel mode driver
|
|
|
|
Revision History:
|
|
|
|
Feb 2000 - Original version
|
|
|
|
--*/
|
|
|
|
// ===========================================================================
|
|
//
|
|
// DECLARATIONS
|
|
//
|
|
// ===========================================================================
|
|
|
|
//
|
|
// Structure for a refcount that can be waited against (when waiting for 0)
|
|
//
|
|
|
|
typedef enum
|
|
{
|
|
WaitRefEnabled = 0,
|
|
WaitRefShuttingDown,
|
|
WaitRefShutdown
|
|
} WAIT_REFCOUNT_STATE;
|
|
|
|
typedef struct _WAIT_REFCOUNT
|
|
{
|
|
LONG Refcount; // The refcount
|
|
NDIS_EVENT Event; // Signaled when RefCount hits 0
|
|
WAIT_REFCOUNT_STATE state; // Current state
|
|
BOOLEAN bResettable; // TRUE if it's OK to reset this
|
|
// refcount when state == WaitRefShuttingDown
|
|
NDIS_SPIN_LOCK lock; // Protects fields above
|
|
|
|
} WAIT_REFCOUNT, *PWAIT_REFCOUNT;
|
|
|
|
// ===========================================================================
|
|
//
|
|
// PROTOTYPES
|
|
//
|
|
// ===========================================================================
|
|
|
|
VOID
|
|
BrdgInitializeWaitRef(
|
|
IN PWAIT_REFCOUNT pRefcount,
|
|
IN BOOLEAN bResettable
|
|
);
|
|
|
|
BOOLEAN
|
|
BrdgIncrementWaitRef(
|
|
IN PWAIT_REFCOUNT pRefcount
|
|
);
|
|
|
|
VOID
|
|
BrdgReincrementWaitRef(
|
|
IN PWAIT_REFCOUNT pRefcount
|
|
);
|
|
|
|
VOID
|
|
BrdgDecrementWaitRef(
|
|
IN PWAIT_REFCOUNT pRefcount
|
|
);
|
|
|
|
VOID
|
|
BrdgBlockWaitRef(
|
|
IN PWAIT_REFCOUNT pRefcount
|
|
);
|
|
|
|
BOOLEAN
|
|
BrdgShutdownBlockedWaitRef(
|
|
IN PWAIT_REFCOUNT pRefcount
|
|
);
|
|
|
|
BOOLEAN
|
|
BrdgShutdownWaitRef(
|
|
IN PWAIT_REFCOUNT pRefcount
|
|
);
|
|
|
|
//
|
|
// Use when it should be impossible for two or more threads of
|
|
// execution to simultaneously shut down your waitref.
|
|
//
|
|
__inline
|
|
VOID
|
|
BrdgShutdownWaitRefOnce(
|
|
IN PWAIT_REFCOUNT pRefcount
|
|
)
|
|
{
|
|
BOOLEAN bSuccess = FALSE;
|
|
|
|
bSuccess = BrdgShutdownWaitRef( pRefcount );
|
|
SAFEASSERT( bSuccess );
|
|
}
|
|
|
|
VOID
|
|
BrdgResetWaitRef(
|
|
IN PWAIT_REFCOUNT pRefcount
|
|
);
|
|
|