diff --git a/opengl/libs/EGL/egl_cache.cpp b/opengl/libs/EGL/egl_cache.cpp index c79fb5f28..ed2bef3d4 100644 --- a/opengl/libs/EGL/egl_cache.cpp +++ b/opengl/libs/EGL/egl_cache.cpp @@ -241,19 +241,11 @@ void egl_cache_t::saveBlobCacheLocked() { } size_t fileSize = headerSize + cacheSize; - if (ftruncate(fd, fileSize) == -1) { - ALOGE("error setting cache file size: %s (%d)", strerror(errno), - errno); - close(fd); - unlink(fname); - return; - } - uint8_t* buf = reinterpret_cast(mmap(NULL, fileSize, - PROT_WRITE, MAP_SHARED, fd, 0)); - if (buf == MAP_FAILED) { - ALOGE("error mmaping cache file: %s (%d)", strerror(errno), - errno); + uint8_t* buf = new uint8_t [fileSize]; + if (!buf) { + ALOGE("error allocating buffer for cache contents: %s (%d)", + strerror(errno), errno); close(fd); unlink(fname); return; @@ -264,7 +256,7 @@ void egl_cache_t::saveBlobCacheLocked() { if (err != OK) { ALOGE("error writing cache contents: %s (%d)", strerror(-err), -err); - munmap(buf, fileSize); + delete [] buf; close(fd); unlink(fname); return; @@ -275,7 +267,16 @@ void egl_cache_t::saveBlobCacheLocked() { uint32_t* crc = reinterpret_cast(buf + 4); *crc = crc32c(buf + headerSize, cacheSize); - munmap(buf, fileSize); + if (write(fd, buf, fileSize) == -1) { + ALOGE("error writing cache file: %s (%d)", strerror(errno), + errno); + delete [] buf; + close(fd); + unlink(fname); + return; + } + + delete [] buf; fchmod(fd, S_IRUSR); close(fd); }