216 lines
3.6 KiB
C++
216 lines
3.6 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (C) Microsoft Corporation, 1991 - 1999
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
interlck.hxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
A class which represents an integer on which you can perform
|
|||
|
interlocked increments and decrements lives in this file. This
|
|||
|
class will be implemented differently on every operating system
|
|||
|
where this support is necessary. This particular version is for
|
|||
|
NT and Win32.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Michael Montague (mikemon) 19-Nov-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef __INTERLCK_HXX__
|
|||
|
#define __INTERLCK_HXX__
|
|||
|
|
|||
|
|
|||
|
class INTERLOCKED_INTEGER
|
|||
|
/*++
|
|||
|
|
|||
|
Class Description:
|
|||
|
|
|||
|
This class implements an integer on which you can perform interlocked
|
|||
|
increments and decrements.
|
|||
|
|
|||
|
Fields:
|
|||
|
|
|||
|
Integer - Contains the interlocked integer.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
private:
|
|||
|
|
|||
|
long Integer;
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
INTERLOCKED_INTEGER (
|
|||
|
IN long InitialValue
|
|||
|
);
|
|||
|
|
|||
|
long
|
|||
|
Increment (
|
|||
|
);
|
|||
|
|
|||
|
long
|
|||
|
Decrement (
|
|||
|
);
|
|||
|
|
|||
|
long
|
|||
|
Exchange (
|
|||
|
IN long ExchangeValue
|
|||
|
);
|
|||
|
|
|||
|
long
|
|||
|
CompareExchange(
|
|||
|
IN long NewValue,
|
|||
|
IN long Comparand
|
|||
|
);
|
|||
|
|
|||
|
long
|
|||
|
GetInteger (
|
|||
|
);
|
|||
|
|
|||
|
void
|
|||
|
SetInteger ( long
|
|||
|
);
|
|||
|
|
|||
|
inline void SingleThreadedIncrement(void)
|
|||
|
{
|
|||
|
Integer ++;
|
|||
|
}
|
|||
|
|
|||
|
inline void SingleThreadedIncrement(long nReferences)
|
|||
|
{
|
|||
|
Integer += nReferences;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
inline
|
|||
|
INTERLOCKED_INTEGER::INTERLOCKED_INTEGER (
|
|||
|
IN long InitialValue
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
All this routine has got to do is to set the initial value of the
|
|||
|
integer.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
InitialValue - Supplies the initial value for the integer contained
|
|||
|
in this.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
Integer = InitialValue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
inline long
|
|||
|
INTERLOCKED_INTEGER::Increment (
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine performs an interlocked increment of the integer
|
|||
|
contained in this. An interlocked increment is an atomic operation;
|
|||
|
if two threads each increment the interlocked integer, then the
|
|||
|
integer will be two larger than it was before in all cases.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return((long) InterlockedIncrement(&Integer));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
inline long
|
|||
|
INTERLOCKED_INTEGER::Decrement (
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine is the same as INTERLOCKED_INTEGER::Decrement, except
|
|||
|
that it decrements the integer rather than incrementing it.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return((long) InterlockedDecrement(&Integer));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
inline long
|
|||
|
INTERLOCKED_INTEGER::Exchange (
|
|||
|
IN long ExchangeValue
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This does the thread-safe exchange of 2 long values.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return((long) InterlockedExchange(&Integer, ExchangeValue));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
inline long
|
|||
|
INTERLOCKED_INTEGER::CompareExchange(
|
|||
|
IN long NewValue,
|
|||
|
IN long Comparand
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This does a thread-safe exchange iff the current value of the counter is
|
|||
|
equal to the value of the Comparand parameter
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
The original value of the counter. If not equal to the Comparand the
|
|||
|
value of the counter has not been changed by this call.
|
|||
|
--*/
|
|||
|
{
|
|||
|
return ((long) InterlockedCompareExchange(&Integer, NewValue, Comparand));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
inline long
|
|||
|
INTERLOCKED_INTEGER::GetInteger (
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns the current value of the integer.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
return(Integer);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
inline void
|
|||
|
INTERLOCKED_INTEGER::SetInteger ( long value
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine sets the current value of the integer.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
Integer = value;
|
|||
|
}
|
|||
|
|
|||
|
#endif // __INTERLCK_HXX__
|