xref: /aosp_15_r20/external/cronet/third_party/ashmem/patches/0003-Pthread-once-for-funcs-init.patch (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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