2929#include < sys/swap.h>
3030#endif
3131
32+ #ifdef __linux__
33+ #include < linux/membarrier.h>
34+ #include < sys/syscall.h>
35+ #define membarrier (...) syscall(__NR_membarrier, __VA_ARGS__)
36+ #elif HAVE_SYS_MEMBARRIER_H
37+ #include < sys/membarrier.h>
38+ #endif
39+
3240#include < sys/resource.h>
3341
3442#undef min
@@ -94,10 +102,6 @@ extern "C"
94102#include < OS.h>
95103#endif // __HAIKU__
96104
97- #ifdef __linux__
98- #include < sys/syscall.h> // __NR_membarrier
99- #endif
100-
101105#if HAVE_PTHREAD_NP_H
102106#include < pthread_np.h>
103107#endif
@@ -132,29 +136,9 @@ typedef cpuset_t cpu_set_t;
132136// The cached total number of CPUs that can be used in the OS.
133137static uint32_t g_totalCpuCount = 0 ;
134138
135- //
136- // Helper membarrier function
137- //
138- #ifdef __NR_membarrier
139- # define membarrier (...) syscall(__NR_membarrier, __VA_ARGS__)
140- #else
141- # define membarrier (...) -ENOSYS
142- #endif
143-
144- enum membarrier_cmd
145- {
146- MEMBARRIER_CMD_QUERY = 0 ,
147- MEMBARRIER_CMD_GLOBAL = (1 << 0 ),
148- MEMBARRIER_CMD_GLOBAL_EXPEDITED = (1 << 1 ),
149- MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = (1 << 2 ),
150- MEMBARRIER_CMD_PRIVATE_EXPEDITED = (1 << 3 ),
151- MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = (1 << 4 ),
152- MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = (1 << 5 ),
153- MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = (1 << 6 )
154- };
155-
156139bool CanFlushUsingMembarrier ()
157140{
141+ #if defined(__linux__) || HAVE_SYS_MEMBARRIER_H
158142
159143#ifdef TARGET_ANDROID
160144 // Avoid calling membarrier on older Android versions where membarrier
@@ -169,15 +153,16 @@ bool CanFlushUsingMembarrier()
169153 // Starting with Linux kernel 4.14, process memory barriers can be generated
170154 // using MEMBARRIER_CMD_PRIVATE_EXPEDITED.
171155
172- int mask = membarrier (MEMBARRIER_CMD_QUERY, 0 );
156+ int mask = membarrier (MEMBARRIER_CMD_QUERY, 0 , 0 );
173157
174158 if (mask >= 0 &&
175159 mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED &&
176160 // Register intent to use the private expedited command.
177- membarrier (MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0 ) == 0 )
161+ membarrier (MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0 , 0 ) == 0 )
178162 {
179163 return true ;
180164 }
165+ #endif
181166
182167 return false ;
183168}
@@ -423,12 +408,15 @@ bool GCToOSInterface::CanGetCurrentProcessorNumber()
423408// Flush write buffers of processors that are executing threads of the current process
424409void GCToOSInterface::FlushProcessWriteBuffers ()
425410{
411+ #if defined(__linux__) || HAVE_SYS_MEMBARRIER_H
426412 if (s_flushUsingMemBarrier)
427413 {
428- int status = membarrier (MEMBARRIER_CMD_PRIVATE_EXPEDITED, 0 );
414+ int status = membarrier (MEMBARRIER_CMD_PRIVATE_EXPEDITED, 0 , 0 );
429415 assert (status == 0 && " Failed to flush using membarrier" );
430416 }
431- else if (g_helperPage != 0 )
417+ else
418+ #endif
419+ if (g_helperPage != 0 )
432420 {
433421 int status = pthread_mutex_lock (&g_flushProcessWriteBuffersMutex);
434422 assert (status == 0 && " Failed to lock the flushProcessWriteBuffersMutex lock" );
0 commit comments