118 lines
2.1 KiB
C
118 lines
2.1 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
intrloc2.c
|
||
|
||
Abstract:
|
||
|
||
This module implements the *portable* (i.e. SLOW) versions of
|
||
the executive's simple atomic increment/decrement procedures.
|
||
Real implementation should be in assembler.
|
||
|
||
Author:
|
||
|
||
Bryan Willman (bryanwi) 2-Aug-90
|
||
|
||
Environment:
|
||
|
||
Kernel mode only.
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "exp.h"
|
||
|
||
INTERLOCKED_RESULT
|
||
ExInterlockedIncrementLong (
|
||
IN PLONG Addend,
|
||
IN PKSPIN_LOCK Lock
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function atomically increments Addend, returning an ennumerated
|
||
type which indicates what interesting transitions in the value of
|
||
Addend occurred due the operation.
|
||
|
||
Arguments:
|
||
|
||
Addend - Pointer to variable to increment.
|
||
|
||
Lock - Spinlock used to implement atomicity.
|
||
|
||
Return Value:
|
||
|
||
An ennumerated type:
|
||
|
||
ResultNegative if Addend is < 0 after increment.
|
||
ResultZero if Addend is = 0 after increment.
|
||
ResultPositive if Addend is > 0 after increment.
|
||
|
||
--*/
|
||
|
||
{
|
||
LONG OldValue;
|
||
|
||
OldValue = (LONG)ExInterlockedAddUlong((PULONG)Addend, 1, Lock);
|
||
|
||
if (OldValue < -1)
|
||
return ResultNegative;
|
||
|
||
if (OldValue == -1)
|
||
return ResultZero;
|
||
|
||
if (OldValue > -1)
|
||
return ResultPositive;
|
||
}
|
||
|
||
INTERLOCKED_RESULT
|
||
ExInterlockedDecrementLong (
|
||
IN PLONG Addend,
|
||
IN PKSPIN_LOCK Lock
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function atomically decrements Addend, returning an ennumerated
|
||
type which indicates what interesting transitions in the value of
|
||
Addend occurred due the operation.
|
||
|
||
Arguments:
|
||
|
||
Addend - Pointer to variable to decrement.
|
||
|
||
Lock - Spinlock used to implement atomicity.
|
||
|
||
Return Value:
|
||
|
||
An ennumerated type:
|
||
|
||
ResultNegative if Addend is < 0 after decrement.
|
||
ResultZero if Addend is = 0 after decrement.
|
||
ResultPositive if Addend is > 0 after decrement.
|
||
|
||
--*/
|
||
|
||
{
|
||
LONG OldValue;
|
||
|
||
OldValue = (LONG)ExInterlockedAddUlong((PULONG)Addend, -1, Lock);
|
||
|
||
if (OldValue > 1)
|
||
return ResultPositive;
|
||
|
||
if (OldValue == 1)
|
||
return ResultZero;
|
||
|
||
if (OldValue < 1)
|
||
return ResultNegative;
|
||
}
|