diff options
-rw-r--r-- | libartpalette/system/palette_android.cc | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/libartpalette/system/palette_android.cc b/libartpalette/system/palette_android.cc index 4ef4a88ba3..bb9841ae66 100644 --- a/libartpalette/system/palette_android.cc +++ b/libartpalette/system/palette_android.cc @@ -19,6 +19,7 @@ #include "palette/palette.h" #include <errno.h> +#include <linux/ashmem.h> #include <sys/resource.h> #include <sys/time.h> #include <unistd.h> @@ -28,7 +29,6 @@ #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/macros.h> -#include <cutils/ashmem.h> #include <cutils/sched_policy.h> #include <cutils/trace.h> #include <log/event_tag_map.h> @@ -174,15 +174,38 @@ enum PaletteStatus PaletteTraceIntegerValue(const char* name, int32_t value) { } enum PaletteStatus PaletteAshmemCreateRegion(const char* name, size_t size, int* fd) { - *fd = ashmem_create_region(name, size); - if (*fd < 0) { + // We implement our own ashmem creation, as the libcutils implementation does + // a binder call, and our only use of ashmem in ART is for zygote, which + // cannot communicate to binder. + *fd = TEMP_FAILURE_RETRY(open("/dev/ashmem", O_RDWR | O_CLOEXEC)); + if (*fd == -1) { return PaletteStatus::kCheckErrno; } + + if (TEMP_FAILURE_RETRY(ioctl(*fd, ASHMEM_SET_SIZE, size)) < 0) { + goto error; + } + + if (name != nullptr) { + char buf[ASHMEM_NAME_LEN] = {0}; + strlcpy(buf, name, sizeof(buf)); + if (TEMP_FAILURE_RETRY(ioctl(*fd, ASHMEM_SET_NAME, buf)) < 0) { + goto error; + } + } + return PaletteStatus::kOkay; + +error: + // Save errno before closing. + int save_errno = errno; + close(*fd); + errno = save_errno; + return PaletteStatus::kCheckErrno; } enum PaletteStatus PaletteAshmemSetProtRegion(int fd, int prot) { - if (ashmem_set_prot_region(fd, prot) < 0) { + if (TEMP_FAILURE_RETRY(ioctl(fd, ASHMEM_SET_PROT_MASK, prot)) < 0) { return PaletteStatus::kCheckErrno; } return PaletteStatus::kOkay; |