ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libecb/ecb.h
(Generate patch)

Comparing libecb/ecb.h (file contents):
Revision 1.60 by root, Thu Aug 4 13:35:46 2011 UTC vs.
Revision 1.62 by root, Thu Aug 4 14:34:00 2011 UTC

82 #define ECB_MEMORY_FENCE_RELEASE do { } while (0) /* unlikely to change in future cpus */ 82 #define ECB_MEMORY_FENCE_RELEASE do { } while (0) /* unlikely to change in future cpus */
83 #elif __amd64 83 #elif __amd64
84 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory") 84 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory")
85 #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("lfence" : : : "memory") 85 #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("lfence" : : : "memory")
86 #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("sfence") /* play safe - not needed in any current cpu */ 86 #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("sfence") /* play safe - not needed in any current cpu */
87 #elif defined(__ARM_ARCH_6__ ) || defined(__ARM_ARCH_6J__ ) \
88 || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) \
89 || defined(__ARM_ARCH_7__ ) || defined(__ARM_ARCH_7A__ ) \
90 || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7R__ )
91 #define ECB_MEMORY_FENCE \
92 do { \
93 int null = 0; \
94 __asm__ __volatile__ ("mcr p15,0,%0,c6,c10,5", : "=&r" (null) : : "memory"); \
95 while (0)
87 #endif 96 #endif
88 #endif 97 #endif
89#endif 98#endif
90 99
91#ifndef ECB_MEMORY_FENCE 100#ifndef ECB_MEMORY_FENCE
92 #if ECB_GCC_VERSION(4,4) 101 #if ECB_GCC_VERSION(4,4) || defined(__INTEL_COMPILER)
93 #define ECB_MEMORY_FENCE __sync_synchronize () 102 #define ECB_MEMORY_FENCE __sync_synchronize ()
94 #define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) 103 /*#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */
95 #define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) 104 /*#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) */
96 #elif _MSC_VER >= 1400 /* VC++ 2005 */ 105 #elif _MSC_VER >= 1400 /* VC++ 2005 */
97 #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) 106 #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier)
98 #define ECB_MEMORY_FENCE _ReadWriteBarrier () 107 #define ECB_MEMORY_FENCE _ReadWriteBarrier ()
99 #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ 108 #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */
100 #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () 109 #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier ()
101 #elif defined(_WIN32) 110 #elif defined(_WIN32)
102 #include <WinNT.h> 111 #include <WinNT.h>
103 #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ 112 #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */
104 #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE
105 #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE
106 #endif 113 #endif
107#endif 114#endif
108 115
109#ifndef ECB_MEMORY_FENCE 116#ifndef ECB_MEMORY_FENCE
117 #if !ECB_AVOID_PTHREADS
110 /* 118 /*
111 * if you get undefined symbol references to pthread_mutex_lock, 119 * if you get undefined symbol references to pthread_mutex_lock,
112 * or failure to find pthread.h, then you should implement 120 * or failure to find pthread.h, then you should implement
113 * the ECB_MEMORY_FENCE operations for your cpu/compiler 121 * the ECB_MEMORY_FENCE operations for your cpu/compiler
114 * OR provide pthread.h and link against the posix thread library 122 * OR provide pthread.h and link against the posix thread library
115 * of your system. 123 * of your system.
116 */ 124 */
117 #include <pthread.h> 125 #include <pthread.h>
118 #define ECB_NEEDS_PTHREADS 1 126 #define ECB_NEEDS_PTHREADS 1
119 #define ECB_MEMORY_FENCE_NEEDS_PTHREADS 1 127 #define ECB_MEMORY_FENCE_NEEDS_PTHREADS 1
120 128
121 static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER; 129 static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER;
122 #define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0) 130 #define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0)
131 #endif
132#endif
133
134#if !defined(ECB_MEMORY_FENCE_ACQUIRE) && defined(ECB_MEMORY_FENCE)
123 #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE 135 #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE
136#endif
137
138#if !defined(ECB_MEMORY_FENCE_RELEASE) && defined(ECB_MEMORY_FENCE)
124 #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE 139 #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE
125#endif 140#endif
126 141
127/*****************************************************************************/ 142/*****************************************************************************/
128 143

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines