/* * Pull the contents of a file into an new shared memory segment. We grab * everything from fd's current offset on. * * We need to know the length ahead of time so we can allocate a segment * of sufficient size. */ int sysLoadFileInShmem(int fd, MemMapping* pMap) { loff_t start; size_t length, actual; void* memPtr; assert(pMap != NULL); if (getFileStartAndLength(fd, &start, &length) < 0) return -1; memPtr = sysCreateAnonShmem(length); if (memPtr == NULL) return -1; actual = read(fd, memPtr, length); if (actual != length) { LOGE("only read %d of %d bytes\n", (int) actual, (int) length); sysReleaseShmem(pMap); return -1; } pMap->baseAddr = pMap->addr = memPtr; pMap->baseLength = pMap->length = length; return 0; }
/* * Pull the contents of a file into an new shared memory segment. We grab * everything from fd's current offset on. * * We need to know the length ahead of time so we can allocate a segment * of sufficient size. */ int sysLoadFileInShmem(int fd, MemMapping* pMap) { #ifdef HAVE_POSIX_FILEMAP off_t start; size_t length, actual; void* memPtr; assert(pMap != NULL); if (getFileStartAndLength(fd, &start, &length) < 0) return -1; memPtr = sysCreateAnonShmem(length); if (memPtr == NULL) return -1; actual = read(fd, memPtr, length); if (actual != length) { ALOGE("only read %d of %d bytes", (int) actual, (int) length); sysReleaseShmem(pMap); return -1; } pMap->baseAddr = pMap->addr = memPtr; pMap->baseLength = pMap->length = length; return 0; #else ALOGE("sysLoadFileInShmem not implemented."); return -1; #endif }
/* * Create a private anonymous storage area. */ int sysCreatePrivateMap(size_t length, MemMapping* pMap) { void* memPtr; memPtr = sysCreateAnonShmem(length); if (memPtr == NULL) return -1; pMap->addr = pMap->baseAddr = memPtr; pMap->length = pMap->baseLength = length; return 0; }