Source code of Windows XP (NT5)
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.
|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
intbits.c
Abstract:
This module contains routines to do interlocked bit manipulation
Author:
Neill Clift (NeillC) 12-May-2000
Environment:
User and kernel mode.
Revision History:
Rob Earhart (earhart) October 13, 2000 Moved from Ex to Rtl
--*/
#include "ntrtlp.h"
#pragma hdrstop
#undef RtlInterlockedSetBits
NTKERNELAPI ULONG FASTCALL RtlInterlockedSetBits ( IN OUT PULONG Flags, IN ULONG Flag ) /*++
Routine Description:
This function atomically sets the specified flags in the target
Arguments:
Flags - Pointer to variable containing current mask.
Flag - Flags to set in target
Return Value:
ULONG - Old value of mask before modification
--*/ { ULONG NewFlags, OldFlags;
OldFlags = *Flags; NewFlags = OldFlags | Flag; while (NewFlags != OldFlags) { NewFlags = InterlockedCompareExchange ((PLONG) Flags, (LONG) NewFlags, (LONG) OldFlags); if (NewFlags == OldFlags) { break; } OldFlags = NewFlags; NewFlags |= Flag; } return OldFlags; }
#undef RtlInterlockedClearBits
NTKERNELAPI ULONG FASTCALL RtlInterlockedClearBits ( IN OUT PULONG Flags, IN ULONG Flag ) /*++
Routine Description:
This function atomically clears the specified flags in the target
Arguments:
Flags - Pointer to variable containing current mask.
Flag - Flags to clear in target
Return Value:
ULONG - Old value of mask before modification
--*/ { ULONG NewFlags, OldFlags;
OldFlags = *Flags; NewFlags = OldFlags & ~Flag; while (NewFlags != OldFlags) { NewFlags = InterlockedCompareExchange ((PLONG) Flags, (LONG) NewFlags, (LONG) OldFlags); if (NewFlags == OldFlags) { break; } OldFlags = NewFlags; NewFlags &= ~Flag; } return OldFlags; }
#undef RtlInterlockedSetClearBits
NTKERNELAPI ULONG FASTCALL RtlInterlockedSetClearBits ( IN OUT PULONG Flags, IN ULONG sFlag, IN ULONG cFlag ) /*++
Routine Description:
This function atomically sets and clears the specified flags in the target
Arguments:
Flags - Pointer to variable containing current mask.
sFlag - Flags to set in target
CFlag - Flags to clear in target
Return Value:
ULONG - Old value of mask before modification
--*/ { ULONG NewFlags, OldFlags;
OldFlags = *Flags; NewFlags = (OldFlags | sFlag) & ~cFlag; while (NewFlags != OldFlags) { NewFlags = InterlockedCompareExchange ((PLONG) Flags, (LONG) NewFlags, (LONG) OldFlags); if (NewFlags == OldFlags) { break; } OldFlags = NewFlags; NewFlags = (NewFlags | sFlag) & ~cFlag; } return OldFlags; }
|