diff --git a/libcutils/ashmem-dev.cpp b/libcutils/ashmem-dev.cpp index e35b91ae3..e67b45808 100644 --- a/libcutils/ashmem-dev.cpp +++ b/libcutils/ashmem-dev.cpp @@ -73,6 +73,8 @@ static pthread_mutex_t __ashmem_lock = PTHREAD_MUTEX_INITIALIZER; #ifndef __ANDROID_VNDK__ using openFdType = int (*)(); +static openFdType openFd; + openFdType initOpenAshmemFd() { openFdType openFd = nullptr; void* handle = dlopen("libashmemd_client.so", RTLD_NOW); @@ -221,7 +223,10 @@ static int __ashmem_open_locked() int fd = -1; #ifndef __ANDROID_VNDK__ - static auto openFd = initOpenAshmemFd(); + if (!openFd) { + openFd = initOpenAshmemFd(); + } + if (openFd) { fd = openFd(); } @@ -480,3 +485,11 @@ int ashmem_get_size_region(int fd) return __ashmem_check_failure(fd, TEMP_FAILURE_RETRY(ioctl(fd, ASHMEM_GET_SIZE, NULL))); } + +void ashmem_init() { +#ifndef __ANDROID_VNDK__ + pthread_mutex_lock(&__ashmem_lock); + openFd = initOpenAshmemFd(); + pthread_mutex_unlock(&__ashmem_lock); +#endif //__ANDROID_VNDK__ +} diff --git a/libcutils/ashmem-host.cpp b/libcutils/ashmem-host.cpp index bb990d562..32446d478 100644 --- a/libcutils/ashmem-host.cpp +++ b/libcutils/ashmem-host.cpp @@ -82,3 +82,5 @@ int ashmem_get_size_region(int fd) return buf.st_size; } + +void ashmem_init() {} diff --git a/libcutils/include/cutils/ashmem.h b/libcutils/include/cutils/ashmem.h index d80caa698..abc50681a 100644 --- a/libcutils/include/cutils/ashmem.h +++ b/libcutils/include/cutils/ashmem.h @@ -26,6 +26,7 @@ int ashmem_set_prot_region(int fd, int prot); int ashmem_pin_region(int fd, size_t offset, size_t len); int ashmem_unpin_region(int fd, size_t offset, size_t len); int ashmem_get_size_region(int fd); +void ashmem_init(); #ifdef __cplusplus }