1diff --git a/third_party/ashmem/ashmem-dev.c b/third_party/ashmem/ashmem-dev.c 2index 25a33cdcd0c8..399ea36ce382 100644 3--- a/third_party/ashmem/ashmem-dev.c 4+++ b/third_party/ashmem/ashmem-dev.c 5@@ -18,6 +18,7 @@ 6 7 #include <dlfcn.h> 8 #include <errno.h> 9+#include <pthread.h> 10 #include <unistd.h> 11 #include <stdlib.h> 12 #include <string.h> 13@@ -190,26 +191,30 @@ typedef struct { 14 ASharedMemory_setProtFunc setProt; 15 } ASharedMemoryFuncs; 16 17-const ASharedMemoryFuncs* ashmem_get_funcs() { 18- static ASharedMemoryFuncs s_ashmem_funcs = {}; 19+static ASharedMemoryFuncs s_ashmem_funcs = {}; 20+static pthread_once_t s_ashmem_funcs_once = PTHREAD_ONCE_INIT; 21+ 22+static void ashmem_init_funcs() { 23 ASharedMemoryFuncs* funcs = &s_ashmem_funcs; 24- if (funcs->create == NULL) { 25- if (device_api_level() >= __ANDROID_API_O__) { 26- /* Leaked intentionally! */ 27- void* lib = dlopen("libandroid.so", RTLD_NOW); 28- funcs->create = (ASharedMemory_createFunc) 29- dlsym(lib, "ASharedMemory_create"); 30- funcs->getSize = (ASharedMemory_getSizeFunc) 31- dlsym(lib, "ASharedMemory_getSize"); 32- funcs->setProt = (ASharedMemory_setProtFunc) 33- dlsym(lib, "ASharedMemory_setProt"); 34- } else { 35- funcs->create = &ashmem_dev_create_region; 36- funcs->getSize = &ashmem_dev_get_size_region; 37- funcs->setProt = &ashmem_dev_set_prot_region; 38- } 39+ if (device_api_level() >= __ANDROID_API_O__) { 40+ /* Leaked intentionally! */ 41+ void* lib = dlopen("libandroid.so", RTLD_NOW); 42+ funcs->create = 43+ (ASharedMemory_createFunc)dlsym(lib, "ASharedMemory_create"); 44+ funcs->getSize = 45+ (ASharedMemory_getSizeFunc)dlsym(lib, "ASharedMemory_getSize"); 46+ funcs->setProt = 47+ (ASharedMemory_setProtFunc)dlsym(lib, "ASharedMemory_setProt"); 48+ } else { 49+ funcs->create = &ashmem_dev_create_region; 50+ funcs->getSize = &ashmem_dev_get_size_region; 51+ funcs->setProt = &ashmem_dev_set_prot_region; 52 } 53- return funcs; 54+} 55+ 56+static const ASharedMemoryFuncs* ashmem_get_funcs() { 57+ pthread_once(&s_ashmem_funcs_once, ashmem_init_funcs); 58+ return &s_ashmem_funcs; 59 } 60 61 int ashmem_create_region(const char* name, size_t size) { 62