Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _GLIBCXX_ATOMICITY_H
00031 #define _GLIBCXX_ATOMICITY_H 1
00032
00033 #include <bits/c++config.h>
00034 #include <bits/gthr.h>
00035 #include <bits/atomic_word.h>
00036
00037 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
00038 {
00039 _GLIBCXX_BEGIN_NAMESPACE_VERSION
00040
00041
00042
00043
00044
00045 #ifdef _GLIBCXX_ATOMIC_BUILTINS_4
00046 static inline _Atomic_word
00047 __exchange_and_add(volatile _Atomic_word* __mem, int __val)
00048 { return __sync_fetch_and_add(__mem, __val); }
00049
00050 static inline void
00051 __atomic_add(volatile _Atomic_word* __mem, int __val)
00052 { __sync_fetch_and_add(__mem, __val); }
00053 #else
00054 _Atomic_word
00055 __attribute__ ((__unused__))
00056 __exchange_and_add(volatile _Atomic_word*, int) throw ();
00057
00058 void
00059 __attribute__ ((__unused__))
00060 __atomic_add(volatile _Atomic_word*, int) throw ();
00061 #endif
00062
00063 static inline _Atomic_word
00064 __exchange_and_add_single(_Atomic_word* __mem, int __val)
00065 {
00066 _Atomic_word __result = *__mem;
00067 *__mem += __val;
00068 return __result;
00069 }
00070
00071 static inline void
00072 __atomic_add_single(_Atomic_word* __mem, int __val)
00073 { *__mem += __val; }
00074
00075 static inline _Atomic_word
00076 __attribute__ ((__unused__))
00077 __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
00078 {
00079 #ifdef __GTHREADS
00080 if (__gthread_active_p())
00081 return __exchange_and_add(__mem, __val);
00082 else
00083 return __exchange_and_add_single(__mem, __val);
00084 #else
00085 return __exchange_and_add_single(__mem, __val);
00086 #endif
00087 }
00088
00089 static inline void
00090 __attribute__ ((__unused__))
00091 __atomic_add_dispatch(_Atomic_word* __mem, int __val)
00092 {
00093 #ifdef __GTHREADS
00094 if (__gthread_active_p())
00095 __atomic_add(__mem, __val);
00096 else
00097 __atomic_add_single(__mem, __val);
00098 #else
00099 __atomic_add_single(__mem, __val);
00100 #endif
00101 }
00102
00103 _GLIBCXX_END_NAMESPACE_VERSION
00104 }
00105
00106
00107
00108
00109 #ifndef _GLIBCXX_READ_MEM_BARRIER
00110 #define _GLIBCXX_READ_MEM_BARRIER __asm __volatile ("":::"memory")
00111 #endif
00112 #ifndef _GLIBCXX_WRITE_MEM_BARRIER
00113 #define _GLIBCXX_WRITE_MEM_BARRIER __asm __volatile ("":::"memory")
00114 #endif
00115
00116 #endif