Chris@16
|
1 #ifndef BOOST_THREAD_DETAIL_INTERLOCKED_READ_WIN32_HPP
|
Chris@16
|
2 #define BOOST_THREAD_DETAIL_INTERLOCKED_READ_WIN32_HPP
|
Chris@16
|
3
|
Chris@16
|
4 // interlocked_read_win32.hpp
|
Chris@16
|
5 //
|
Chris@16
|
6 // (C) Copyright 2005-8 Anthony Williams
|
Chris@16
|
7 // (C) Copyright 2012 Vicente J. Botet Escriba
|
Chris@16
|
8 //
|
Chris@16
|
9 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
10 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
11 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
12
|
Chris@16
|
13 #include <boost/detail/interlocked.hpp>
|
Chris@16
|
14 #include <boost/thread/detail/config.hpp>
|
Chris@16
|
15
|
Chris@16
|
16 #include <boost/config/abi_prefix.hpp>
|
Chris@16
|
17
|
Chris@16
|
18 #ifdef BOOST_MSVC
|
Chris@16
|
19
|
Chris@16
|
20 namespace boost
|
Chris@16
|
21 {
|
Chris@16
|
22 namespace detail
|
Chris@16
|
23 {
|
Chris@101
|
24 // Since VS2005 volatile reads always acquire
|
Chris@16
|
25 inline long interlocked_read_acquire(long volatile* x) BOOST_NOEXCEPT
|
Chris@16
|
26 {
|
Chris@16
|
27 long const res=*x;
|
Chris@16
|
28 return res;
|
Chris@16
|
29 }
|
Chris@16
|
30 inline void* interlocked_read_acquire(void* volatile* x) BOOST_NOEXCEPT
|
Chris@16
|
31 {
|
Chris@16
|
32 void* const res=*x;
|
Chris@16
|
33 return res;
|
Chris@16
|
34 }
|
Chris@16
|
35
|
Chris@101
|
36 // Since VS2005 volatile writes always release
|
Chris@16
|
37 inline void interlocked_write_release(long volatile* x,long value) BOOST_NOEXCEPT
|
Chris@16
|
38 {
|
Chris@16
|
39 *x=value;
|
Chris@16
|
40 }
|
Chris@16
|
41 inline void interlocked_write_release(void* volatile* x,void* value) BOOST_NOEXCEPT
|
Chris@16
|
42 {
|
Chris@16
|
43 *x=value;
|
Chris@16
|
44 }
|
Chris@16
|
45 }
|
Chris@16
|
46 }
|
Chris@16
|
47
|
Chris@16
|
48 #else
|
Chris@16
|
49
|
Chris@16
|
50 namespace boost
|
Chris@16
|
51 {
|
Chris@16
|
52 namespace detail
|
Chris@16
|
53 {
|
Chris@16
|
54 inline long interlocked_read_acquire(long volatile* x) BOOST_NOEXCEPT
|
Chris@16
|
55 {
|
Chris@16
|
56 return BOOST_INTERLOCKED_COMPARE_EXCHANGE(x,0,0);
|
Chris@16
|
57 }
|
Chris@16
|
58 inline void* interlocked_read_acquire(void* volatile* x) BOOST_NOEXCEPT
|
Chris@16
|
59 {
|
Chris@16
|
60 return BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(x,0,0);
|
Chris@16
|
61 }
|
Chris@16
|
62 inline void interlocked_write_release(long volatile* x,long value) BOOST_NOEXCEPT
|
Chris@16
|
63 {
|
Chris@16
|
64 BOOST_INTERLOCKED_EXCHANGE(x,value);
|
Chris@16
|
65 }
|
Chris@16
|
66 inline void interlocked_write_release(void* volatile* x,void* value) BOOST_NOEXCEPT
|
Chris@16
|
67 {
|
Chris@16
|
68 BOOST_INTERLOCKED_EXCHANGE_POINTER(x,value);
|
Chris@16
|
69 }
|
Chris@16
|
70 }
|
Chris@16
|
71 }
|
Chris@16
|
72
|
Chris@16
|
73 #endif
|
Chris@16
|
74
|
Chris@16
|
75 #include <boost/config/abi_suffix.hpp>
|
Chris@16
|
76
|
Chris@16
|
77 #endif
|