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

Comparing libecb/ecb.h (file contents):
Revision 1.61 by root, Thu Aug 4 14:27:40 2011 UTC vs.
Revision 1.63 by root, Thu Aug 4 14:37:46 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 __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__
88 #define ECB_MEMORY_FENCE __asm__ __volatile__ ("sync" : : : "memory")
89 #elif defined(__ARM_ARCH_6__ ) || defined(__ARM_ARCH_6J__ ) \
90 || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) \
91 || defined(__ARM_ARCH_7__ ) || defined(__ARM_ARCH_7A__ ) \
92 || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7R__ )
93 #define ECB_MEMORY_FENCE \
94 do { \
95 int null = 0; \
96 __asm__ __volatile__ ("mcr p15,0,%0,c6,c10,5", : "=&r" (null) : : "memory"); \
97 while (0)
87 #endif 98 #endif
88 #endif 99 #endif
89#endif 100#endif
90 101
91#ifndef ECB_MEMORY_FENCE 102#ifndef ECB_MEMORY_FENCE
92 #if ECB_GCC_VERSION(4,4) || defined(__INTEL_COMPILER) 103 #if ECB_GCC_VERSION(4,4) || defined(__INTEL_COMPILER)
93 #define ECB_MEMORY_FENCE __sync_synchronize () 104 #define ECB_MEMORY_FENCE __sync_synchronize ()
94 #define ECB_MEMORY_FENCE_ACQUIRE __sync_synchronize () /* ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */ 105 /*#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */
95 #define ECB_MEMORY_FENCE_RELEASE __sync_synchronize () /* ({ char dummy = 1; __sync_lock_release (&dummy ); }) */ 106 /*#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) */
96 #elif _MSC_VER >= 1400 /* VC++ 2005 */ 107 #elif _MSC_VER >= 1400 /* VC++ 2005 */
97 #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) 108 #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier)
98 #define ECB_MEMORY_FENCE _ReadWriteBarrier () 109 #define ECB_MEMORY_FENCE _ReadWriteBarrier ()
99 #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ 110 #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */
100 #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () 111 #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier ()
101 #elif defined(_WIN32) 112 #elif defined(_WIN32)
102 #include <WinNT.h> 113 #include <WinNT.h>
103 #define ECB_MEMORY_FENCE MemoryBarrier () /* actually just xchg on x86... scary */ 114 #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 115 #endif
107#endif 116#endif
108 117
109#ifndef ECB_MEMORY_FENCE 118#ifndef ECB_MEMORY_FENCE
119 #if !ECB_AVOID_PTHREADS
110 /* 120 /*
111 * if you get undefined symbol references to pthread_mutex_lock, 121 * if you get undefined symbol references to pthread_mutex_lock,
112 * or failure to find pthread.h, then you should implement 122 * or failure to find pthread.h, then you should implement
113 * the ECB_MEMORY_FENCE operations for your cpu/compiler 123 * the ECB_MEMORY_FENCE operations for your cpu/compiler
114 * OR provide pthread.h and link against the posix thread library 124 * OR provide pthread.h and link against the posix thread library
115 * of your system. 125 * of your system.
116 */ 126 */
117 #include <pthread.h> 127 #include <pthread.h>
118 #define ECB_NEEDS_PTHREADS 1 128 #define ECB_NEEDS_PTHREADS 1
119 #define ECB_MEMORY_FENCE_NEEDS_PTHREADS 1 129 #define ECB_MEMORY_FENCE_NEEDS_PTHREADS 1
120 130
121 static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER; 131 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) 132 #define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0)
133 #endif
134#endif
135
136#if !defined(ECB_MEMORY_FENCE_ACQUIRE) && defined(ECB_MEMORY_FENCE)
123 #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE 137 #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE
138#endif
139
140#if !defined(ECB_MEMORY_FENCE_RELEASE) && defined(ECB_MEMORY_FENCE)
124 #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE 141 #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE
125#endif 142#endif
126 143
127/*****************************************************************************/ 144/*****************************************************************************/
128 145

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines