@@ -2826,17 +2826,26 @@ InitializeFlushProcessWriteBuffers()
28262826 _ASSERTE (s_flushUsingMemBarrier == 0 );
28272827
28282828#if defined(__linux__) || HAVE_SYS_MEMBARRIER_H
2829- // Starting with Linux kernel 4.14, process memory barriers can be generated
2830- // using MEMBARRIER_CMD_PRIVATE_EXPEDITED.
2831- int mask = membarrier (MEMBARRIER_CMD_QUERY, 0 , 0 );
2832- if (mask >= 0 &&
2833- mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED)
2834- {
2835- // Register intent to use the private expedited command.
2836- if (membarrier (MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0 , 0 ) == 0 )
2829+
2830+ #ifdef TARGET_ANDROID
2831+ // Avoid calling membarrier on older Android versions where membarrier
2832+ // may be barred by seccomp causing the process to be killed.
2833+ int apiLevel = android_get_device_api_level ();
2834+ if (apiLevel >= __ANDROID_API_Q__)
2835+ #endif
2836+ {
2837+ // Starting with Linux kernel 4.14, process memory barriers can be generated
2838+ // using MEMBARRIER_CMD_PRIVATE_EXPEDITED.
2839+ int mask = membarrier (MEMBARRIER_CMD_QUERY, 0 , 0 );
2840+ if (mask >= 0 &&
2841+ mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED)
28372842 {
2838- s_flushUsingMemBarrier = TRUE ;
2839- return TRUE ;
2843+ // Register intent to use the private expedited command.
2844+ if (membarrier (MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0 , 0 ) == 0 )
2845+ {
2846+ s_flushUsingMemBarrier = TRUE ;
2847+ return TRUE ;
2848+ }
28402849 }
28412850 }
28422851#endif
0 commit comments