1 : /*
2 : * Copyright 2008, Google Inc.
3 : * All rights reserved.
4 : *
5 : * Redistribution and use in source and binary forms, with or without
6 : * modification, are permitted provided that the following conditions are
7 : * met:
8 : *
9 : * * Redistributions of source code must retain the above copyright
10 : * notice, this list of conditions and the following disclaimer.
11 : * * Redistributions in binary form must reproduce the above
12 : * copyright notice, this list of conditions and the following disclaimer
13 : * in the documentation and/or other materials provided with the
14 : * distribution.
15 : * * Neither the name of Google Inc. nor the names of its
16 : * contributors may be used to endorse or promote products derived from
17 : * this software without specific prior written permission.
18 : *
19 : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 : * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 : * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 : * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 : * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 : * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 : * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 : * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 : * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 : * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 : */
31 :
32 :
33 : #ifndef NATIVE_CLIENT_SRC_INCLUDE_WIN_ATOMIC_OPS_WIN32_H_
34 : #define NATIVE_CLIENT_SRC_INCLUDE_WIN_ATOMIC_OPS_WIN32_H_ 1
35 :
36 : #include "native_client/src/include/portability.h"
37 : #include <windows.h>
38 :
39 : typedef LONG Atomic32;
40 :
41 : static INLINE Atomic32
42 : CompareAndSwap(volatile Atomic32* ptr,
43 : Atomic32 old_value,
44 1 : Atomic32 new_value) {
45 : return InterlockedCompareExchange(ptr,
46 : new_value,
47 1 : old_value);
48 1 : }
49 :
50 : static INLINE Atomic32
51 : AtomicExchange(volatile Atomic32* ptr,
52 1 : Atomic32 new_value) {
53 1 : return (Atomic32)InterlockedExchange(ptr, new_value);
54 1 : }
55 :
56 : static INLINE Atomic32
57 8 : AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) {
58 : Atomic32 result = InterlockedExchangeAdd(
59 : #ifdef WINCE
60 : /* It seems that for WinCE InterlockedExchangeAdd takes LONG* as its first
61 : * parameter. The cast is required to remove the volatile modifier.
62 : */
63 : (Atomic32*) ptr,
64 : #else
65 : ptr,
66 : #endif
67 8 : increment);
68 8 : return result + increment;
69 8 : }
70 :
71 : #endif /* NATIVE_CLIENT_SRC_INCLUDE_WIN_ATOMIC_OPS_WIN32_H_ */
|