EGL: do not use sparse files for shader
- Process is killed by system with SIGBUS signal if it writes data to mapped sparse file on full filesystem. - Allocate space using write() function instead of ftruncate() to avoid creation of sparse files on full filesystem. Catch write() errors to handle out-of-space case during allocation. Bug: http://code.google.com/p/android/issues/detail?id=35376 Change-Id: Ifc366454f34e71a43a0973eda4f591a920ea3a14 Signed-off-by: Kirill Artamonov <kartamonov@nvidia.com>
This commit is contained in:
parent
db1597a989
commit
a30cc7db8d
@ -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<uint8_t*>(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<uint32_t*>(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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user