92 lines
2.8 KiB
C
92 lines
2.8 KiB
C
|
/*
|
||
|
|
||
|
Copyright (c) 1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
intrlckd.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module defines the routines that should have been in the EX package.
|
||
|
This manipulates inter-locked operations on flags and such.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Jameel Hyder (microsoft!jameelh)
|
||
|
|
||
|
|
||
|
Revision History:
|
||
|
5 Sep 1992 Initial Version
|
||
|
|
||
|
Notes: Tab stop: 4
|
||
|
--*/
|
||
|
|
||
|
#ifndef _INTRLCKD_
|
||
|
#define _INTRLCKD_
|
||
|
|
||
|
extern
|
||
|
VOID FASTCALL
|
||
|
AfpInterlockedSetDword(
|
||
|
IN PDWORD pSrc,
|
||
|
IN DWORD Mask,
|
||
|
IN PAFP_SPIN_LOCK pSpinLock
|
||
|
);
|
||
|
|
||
|
|
||
|
extern
|
||
|
VOID FASTCALL
|
||
|
AfpInterlockedClearDword(
|
||
|
IN PDWORD pSrc,
|
||
|
IN DWORD Mask,
|
||
|
IN PAFP_SPIN_LOCK pSpinLock
|
||
|
);
|
||
|
|
||
|
|
||
|
extern
|
||
|
VOID FASTCALL
|
||
|
AfpInterlockedSetNClearDword(
|
||
|
IN PDWORD pSrc,
|
||
|
IN DWORD SetMask,
|
||
|
IN DWORD ClrMask,
|
||
|
IN PAFP_SPIN_LOCK pSpinLock
|
||
|
);
|
||
|
|
||
|
|
||
|
// Macros for Interlocked/ExInterlocked calls
|
||
|
//
|
||
|
// For future reference, here is the difference between all the different
|
||
|
// kernel mode interlocked routines:
|
||
|
//
|
||
|
// InterlockedIncrement/Decrement - fastest on all platforms, inlined
|
||
|
// where appropriate to avoid call overhead. No spinlock required, usable
|
||
|
// on paged data. Operation is atomic ONLY with respect to other Interlocked
|
||
|
// calls.
|
||
|
//
|
||
|
// ExInterlockedIncrement/Decrement - not as efficient, requires a function
|
||
|
// call and a spinlock. Operation is atomic ONLY with respect to other
|
||
|
// ExInterlockedIncrement/Decrement calls. There is no reason to use this
|
||
|
// instead of InterlockedIncrement/Decrement. Does not actually acquire the
|
||
|
// spinlock. Required for backwards compatibility.
|
||
|
//
|
||
|
// ExInterlockedAddUlong - most inefficient, requires a function call and a
|
||
|
// spinlock. Spinlock is actually acquired, so the operation is atomic with
|
||
|
// respect to anything that acquires the same spinlock.
|
||
|
//
|
||
|
#define INTERLOCKED_INCREMENT_LONG(p) InterlockedIncrement(p)
|
||
|
#define INTERLOCKED_DECREMENT_LONG(p) InterlockedDecrement(p)
|
||
|
#define INTERLOCKED_ADD_STATISTICS(p, v, l) ExInterlockedAddLargeStatistic(p, v)
|
||
|
|
||
|
#define INTERLOCKED_INCREMENT_LONG_DPC(p,l) InterlockedIncrement(p)
|
||
|
#define INTERLOCKED_DECREMENT_LONG_DPC(p,l) InterlockedDecrement(p)
|
||
|
#ifdef NT40
|
||
|
#define INTERLOCKED_ADD_ULONG(p, v, l) ExInterlockedExchangeAdd(p, v)
|
||
|
#else
|
||
|
#define INTERLOCKED_ADD_ULONG(p, v, l) ExInterlockedAddUlong(p, v, &(l)->SpinLock)
|
||
|
#endif
|
||
|
#define INTERLOCKED_ADD_ULONG_DPC(p, v, l) ExInterlockedAddUlong(p, v, l)
|
||
|
#define INTERLOCKED_ADD_LARGE_INTGR(p, v, l) ExInterlockedAddLargeInteger(p, v, &(l)->SpinLock)
|
||
|
#define INTERLOCKED_ADD_LARGE_INTGR_DPC(p, v, l) ExInterlockedAddLargeInteger(p, v, &(l)->SpinLock)
|
||
|
|
||
|
#endif // _INTRLCKD_
|