Index: third_party/tcmalloc/chromium/src/maybe_threads.cc |
diff --git a/third_party/tcmalloc/chromium/src/maybe_threads.cc b/third_party/tcmalloc/chromium/src/maybe_threads.cc |
index 15c8a23dcb3509549ef6b45531f2418e988a3cf5..37646d6a50f40042ae70f591f14487246989f024 100644 |
--- a/third_party/tcmalloc/chromium/src/maybe_threads.cc |
+++ b/third_party/tcmalloc/chromium/src/maybe_threads.cc |
@@ -124,7 +124,17 @@ int perftools_pthread_once(pthread_once_t *ctl, |
if (pthread_once) { |
return pthread_once(ctl, init_routine); |
} else { |
+#if defined(__ANDROID__) |
+ // Android's pthread_once_t is typedef volatile and memcmp only takes |
+ // const void*, cast the volatile away. |
+ if (memcmp(const_cast<const void*>(reinterpret_cast<const volatile void*>( |
+ ctl)), |
+ const_cast<const void*>(reinterpret_cast<const volatile void*>( |
+ &pthread_once_init)), |
+ sizeof(*ctl)) == 0) { |
+#else |
if (memcmp(ctl, &pthread_once_init, sizeof(*ctl)) == 0) { |
+#endif |
init_routine(); |
++*(char*)(ctl); // make it so it's no longer equal to init |
} |