b48bfda6ec76f8113298776d3cb032548305df72
[reactos.git] / reactos / lib / intrlck / i386 / exchangeadd.c
1 /*
2 * PROJECT: ReactOS system libraries
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: lib/intrlck/i386/exchangeadd.c
5 * PURPOSE: Inter lock exchange adds
6 * PROGRAMMERS: Copyright 1995 Martin von Loewis
7 * Copyright 1997 Onno Hovers
8 */
9
10 /************************************************************************
11 * InterlockedExchangeAdd
12 *
13 * Atomically adds Increment to Addend and returns the previous value of
14 * Addend
15 *
16 * RETURNS
17 * Prior value of value pointed to by Addend
18 */
19
20 /*
21 * LONG NTAPI InterlockedExchangeAdd(PLONG Addend, LONG Increment)
22 */
23
24 #include <windows.h>
25 LONG
26 NTAPI
27 InterlockedExchangeAdd(
28 IN OUT LONG volatile *Addend,
29 LONG Increment)
30 {
31 LONG ret;
32 __asm__ (
33 /* lock for SMP systems */
34 "lock\n\t"
35 "xaddl %0,(%1)"
36 :"=r" (ret)
37 :"r" (Addend), "0" (Increment)
38 :"memory" );
39 return ret;
40 }