Changed InterlockedIncrement and InterlockedDecrement to return the modified value. Modified: trunk/reactos/lib/rosrtl/misc/intrlck.c _____
Modified: trunk/reactos/lib/rosrtl/misc/intrlck.c --- trunk/reactos/lib/rosrtl/misc/intrlck.c 2005-06-15 23:00:10 UTC (rev 15931) +++ trunk/reactos/lib/rosrtl/misc/intrlck.c 2005-06-15 23:08:33 UTC (rev 15932) @@ -43,13 +43,8 @@
* InterlockedIncrement * * * * InterlockedIncrement adds 1 to a long variable and returns * -* - a negative number if the result < 0 * -* - zero if the result == 0 * -* - a positive number if the result > 0 * -* * -* The returned number need not be equal to the result!!!! * -* note: * -* * +* the resulting incremented value. * +* *
************************************************************************ /
#include <windows.h> @@ -58,23 +53,22 @@ STDCALL InterlockedIncrement(PLONG Addend) { - long ret = 0; + long ret; #ifdef _M_IX86 - __asm__ - ( - "\tlock\n" /* for SMP systems */ - "\tincl (%1)\n" - "\tje 2f\n" - "\tjl 1f\n" - "\tincl %0\n" - "\tjmp 2f\n" - "1:\tdec %0\n" - "2:\n" - :"=r" (ret):"r" (Addend), "0" (0): "memory" - ); + __asm__ + ( + "\tlock\n" /* for SMP systems */ + "\txaddl %0, (%1)\n" + "\tincl %0\n" + :"=r" (ret) + :"r" (Addend), "0" (1) + : "memory" + ); #elif defined(_M_PPC) ret = *Addend; ret = InterlockedExchangeAdd( Addend, ret + 1 ); +#else +#error Unknown compiler for inline assembler #endif return ret; } @@ -82,12 +76,9 @@
/*********************************************************************** * * InterlockedDecrement * * * -* InterlockedIncrement adds 1 to a long variable and returns * -* - a negative number if the result < 0 * -* - zero if the result == 0 * -* - a positive number if the result > 0 * -* * -* The returned number need not be equal to the result!!!! * +* InterlockedDecrement adds -1 to a long variable and returns * +* the resulting decremented value. * +* *
************************************************************************ /
LONG @@ -98,19 +89,18 @@ #ifdef _M_IX86 __asm__ ( - "\tlock\n" /* for SMP systems */ - "\tdecl (%1)\n" - "\tje 2f\n" - "\tjl 1f\n" - "\tincl %0\n" - "\tjmp 2f\n" - "1:\tdec %0\n" - "2:\n" - :"=r" (ret):"r" (lpAddend), "0" (0): "memory" + "\tlock\n" /* for SMP systems */ + "\txaddl %0, (%1)\n" + "\tdecl %0\n" + :"=r" (ret) + :"r" (lpAddend), "0" (-1) + : "memory" ); #elif defined(_M_PPC) ret = *lpAddend; ret = InterlockedExchangeAdd( lpAddend, ret - 1 ); +#else +#error Unknown compiler for inline assembler #endif return ret;
@@ -139,6 +129,8 @@ do { ret = *(volatile LONG *)target; } while( InterlockedCompareExchange( target, value, ret ) != ret ); +#else +#error Unknown compiler for inline assembler #endif return ret; } @@ -174,6 +166,8 @@ : "=&r" (ret) : "b" (Destination), "r" (Comperand), "r" (Exchange) : "cr0", "memory"); +#else +#error Unknown compiler for inline assembler #endif return ret; } @@ -208,6 +202,8 @@ ret = *(volatile LONG *)Addend; newval = ret + Increment; } while (InterlockedCompareExchange(Addend, ret, newval) != ret); +#else +#error Unknown compiler for inline assembler #endif return ret; }