1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Shared file mapping class. 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "filemap" 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/FileMap.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef HAVE_POSIX_FILEMAP 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <memory.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*static*/ long FileMap::mPageSize = -1; 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Constructor. Create an empty object. 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectFileMap::FileMap(void) 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : mRefCount(1), mFileName(NULL), mBasePtr(NULL), mBaseLength(0), 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDataPtr(NULL), mDataLength(0) 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Destructor. 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectFileMap::~FileMap(void) 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project assert(mRefCount == 0); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //printf("+++ removing FileMap %p %u\n", mDataPtr, mDataLength); 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mRefCount = -100; // help catch double-free 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mFileName != NULL) { 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(mFileName); 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef HAVE_POSIX_FILEMAP 66db360642ed7a48eb3b3607a791bbe449cc6529bbJeff Brown if (mBasePtr && munmap(mBasePtr, mBaseLength) != 0) { 679d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("munmap(%p, %d) failed\n", mBasePtr, (int) mBaseLength); 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef HAVE_WIN32_FILEMAP 71db360642ed7a48eb3b3607a791bbe449cc6529bbJeff Brown if (mBasePtr && UnmapViewOfFile(mBasePtr) == 0) { 729d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("UnmapViewOfFile(%p) failed, error = %ld\n", mBasePtr, 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GetLastError() ); 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 75db360642ed7a48eb3b3607a791bbe449cc6529bbJeff Brown if (mFileMapping != INVALID_HANDLE_VALUE) { 76db360642ed7a48eb3b3607a791bbe449cc6529bbJeff Brown CloseHandle(mFileMapping); 77db360642ed7a48eb3b3607a791bbe449cc6529bbJeff Brown } 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CloseHandle(mFileHandle); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Create a new mapping on an open file. 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Closing the file descriptor does not unmap the pages, so we don't 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * claim ownership of the fd. 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Returns "false" on failure. 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 9118092ddc866425598abf4521d9ed4eda9573fdaaKenny Rootbool FileMap::create(const char* origFileName, int fd, off64_t offset, size_t length, 9218092ddc866425598abf4521d9ed4eda9573fdaaKenny Root bool readOnly) 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef HAVE_WIN32_FILEMAP 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int adjust; 9618092ddc866425598abf4521d9ed4eda9573fdaaKenny Root off64_t adjOffset; 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t adjLength; 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mPageSize == -1) { 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project SYSTEM_INFO si; 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GetSystemInfo( &si ); 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPageSize = si.dwAllocationGranularity; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DWORD protect = readOnly ? PAGE_READONLY : PAGE_READWRITE; 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFileHandle = (HANDLE) _get_osfhandle(fd); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFileMapping = CreateFileMapping( mFileHandle, NULL, protect, 0, 0, NULL); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mFileMapping == NULL) { 111e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("CreateFileMapping(%p, %lx) failed with error %ld\n", 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFileHandle, protect, GetLastError() ); 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project adjust = offset % mPageSize; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project adjOffset = offset - adjust; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project adjLength = length + adjust; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mBasePtr = MapViewOfFile( mFileMapping, 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project readOnly ? FILE_MAP_READ : FILE_MAP_ALL_ACCESS, 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (DWORD)(adjOffset), 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project adjLength ); 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mBasePtr == NULL) { 126e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("MapViewOfFile(%ld, %ld) failed with error %ld\n", 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project adjOffset, adjLength, GetLastError() ); 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CloseHandle(mFileMapping); 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFileMapping = INVALID_HANDLE_VALUE; 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifdef HAVE_POSIX_FILEMAP 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int prot, flags, adjust; 13518092ddc866425598abf4521d9ed4eda9573fdaaKenny Root off64_t adjOffset; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t adjLength; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void* ptr; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project assert(mRefCount == 1); 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project assert(fd >= 0); 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project assert(offset >= 0); 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project assert(length > 0); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* init on first use */ 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mPageSize == -1) { 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if NOT_USING_KLIBC 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPageSize = sysconf(_SC_PAGESIZE); 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mPageSize == -1) { 150e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("could not get _SC_PAGESIZE\n"); 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* this holds for Linux, Darwin, Cygwin, and doesn't pain the ARM */ 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mPageSize = 4096; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project adjust = offset % mPageSize; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttry_again: 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project adjOffset = offset - adjust; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project adjLength = length + adjust; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags = MAP_SHARED; 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project prot = PROT_READ; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!readOnly) 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project prot |= PROT_WRITE; 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ptr = mmap(NULL, adjLength, prot, flags, fd, adjOffset); 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ptr == MAP_FAILED) { 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Cygwin does not seem to like file mapping files from an offset. 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // So if we fail, try again with offset zero 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (adjOffset > 0) { 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project adjust = offset; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project goto try_again; 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 178e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("mmap(%ld,%ld) failed: %s\n", 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (long) adjOffset, (long) adjLength, strerror(errno)); 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mBasePtr = ptr; 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif /* HAVE_POSIX_FILEMAP */ 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFileName = origFileName != NULL ? strdup(origFileName) : NULL; 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mBaseLength = adjLength; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDataOffset = offset; 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDataPtr = (char*) mBasePtr + adjust; 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mDataLength = length; 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project assert(mBasePtr != NULL); 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1936807e59e0ff943cc6225d46e3c33a8a7eae9b3d7Steve Block ALOGV("MAP: base %p/%d data %p/%d\n", 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mBasePtr, (int) mBaseLength, mDataPtr, (int) mDataLength); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Provide guidance to the system. 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint FileMap::advise(MapAdvice advice) 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if HAVE_MADVISE 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cc, sysAdvice; 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (advice) { 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case NORMAL: sysAdvice = MADV_NORMAL; break; 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case RANDOM: sysAdvice = MADV_RANDOM; break; 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case SEQUENTIAL: sysAdvice = MADV_SEQUENTIAL; break; 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case WILLNEED: sysAdvice = MADV_WILLNEED; break; 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case DONTNEED: sysAdvice = MADV_DONTNEED; break; 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project assert(false); 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cc = madvise(mBasePtr, mBaseLength, sysAdvice); 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (cc != 0) 22032397c1cd3327905173b36baa6fd1c579bc328ffSteve Block ALOGW("madvise(%d) failed: %s\n", sysAdvice, strerror(errno)); 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return cc; 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // HAVE_MADVISE 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 226