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
00031
00032
00033
00034
00035 #ifndef _GLIBCXX_ATOMICITY_H
00036 #define _GLIBCXX_ATOMICITY_H 1
00037
00038 #include <bits/c++config.h>
00039 #include <bits/gthr.h>
00040 #include <bits/atomic_word.h>
00041
00042 _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
00043
00044
00045
00046
00047
00048 #ifdef _GLIBCXX_ATOMIC_BUILTINS
00049 static inline _Atomic_word
00050 __exchange_and_add(volatile _Atomic_word* __mem, int __val)
00051 { return __sync_fetch_and_add(__mem, __val); }
00052
00053 static inline void
00054 __atomic_add(volatile _Atomic_word* __mem, int __val)
00055 { __sync_fetch_and_add(__mem, __val); }
00056 #else
00057 _Atomic_word
00058 __attribute__ ((__unused__))
00059 __exchange_and_add(volatile _Atomic_word*, int);
00060
00061 void
00062 __attribute__ ((__unused__))
00063 __atomic_add(volatile _Atomic_word*, int);
00064 #endif
00065
00066 static inline _Atomic_word
00067 __exchange_and_add_single(_Atomic_word* __mem, int __val)
00068 {
00069 _Atomic_word __result = *__mem;
00070 *__mem += __val;
00071 return __result;
00072 }
00073
00074 static inline void
00075 __atomic_add_single(_Atomic_word* __mem, int __val)
00076 { *__mem += __val; }
00077
00078 static inline _Atomic_word
00079 __attribute__ ((__unused__))
00080 __exchange_and_add_dispatch(_Atomic_word* __mem, int __val)
00081 {
00082 #ifdef __GTHREADS
00083 if (__gthread_active_p())
00084 return __exchange_and_add(__mem, __val);
00085 else
00086 return __exchange_and_add_single(__mem, __val);
00087 #else
00088 return __exchange_and_add_single(__mem, __val);
00089 #endif
00090 }
00091
00092 static inline void
00093 __attribute__ ((__unused__))
00094 __atomic_add_dispatch(_Atomic_word* __mem, int __val)
00095 {
00096 #ifdef __GTHREADS
00097 if (__gthread_active_p())
00098 __atomic_add(__mem, __val);
00099 else
00100 __atomic_add_single(__mem, __val);
00101 #else
00102 __atomic_add_single(__mem, __val);
00103 #endif
00104 }
00105
00106 _GLIBCXX_END_NAMESPACE
00107
00108
00109
00110
00111 #ifndef _GLIBCXX_READ_MEM_BARRIER
00112 #define _GLIBCXX_READ_MEM_BARRIER __asm __volatile ("":::"memory")
00113 #endif
00114 #ifndef _GLIBCXX_WRITE_MEM_BARRIER
00115 #define _GLIBCXX_WRITE_MEM_BARRIER __asm __volatile ("":::"memory")
00116 #endif
00117
00118 #endif