19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Shared file mapping class.
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "filemap"
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/FileMap.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_POSIX_FILEMAP
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/mman.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <memory.h>
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*static*/ long FileMap::mPageSize = -1;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor.  Create an empty object.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectFileMap::FileMap(void)
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : mRefCount(1), mFileName(NULL), mBasePtr(NULL), mBaseLength(0),
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      mDataPtr(NULL), mDataLength(0)
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Destructor.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectFileMap::~FileMap(void)
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    assert(mRefCount == 0);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("+++ removing FileMap %p %u\n", mDataPtr, mDataLength);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mRefCount = -100;       // help catch double-free
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFileName != NULL) {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        free(mFileName);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_POSIX_FILEMAP
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (munmap(mBasePtr, mBaseLength) != 0) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGD("munmap(%p, %d) failed\n", mBasePtr, (int) mBaseLength);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_WIN32_FILEMAP
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ( UnmapViewOfFile(mBasePtr) == 0) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGD("UnmapViewOfFile(%p) failed, error = %ld\n", mBasePtr,
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              GetLastError() );
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CloseHandle(mFileMapping);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CloseHandle(mFileHandle);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new mapping on an open file.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Closing the file descriptor does not unmap the pages, so we don't
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * claim ownership of the fd.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns "false" on failure.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool FileMap::create(const char* origFileName, int fd, off_t offset, size_t length, bool readOnly)
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_WIN32_FILEMAP
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int     adjust;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    off_t   adjOffset;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t  adjLength;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mPageSize == -1) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SYSTEM_INFO  si;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GetSystemInfo( &si );
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPageSize = si.dwAllocationGranularity;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    DWORD  protect = readOnly ? PAGE_READONLY : PAGE_READWRITE;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mFileHandle  = (HANDLE) _get_osfhandle(fd);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mFileMapping = CreateFileMapping( mFileHandle, NULL, protect, 0, 0, NULL);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mFileMapping == NULL) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("CreateFileMapping(%p, %lx) failed with error %ld\n",
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              mFileHandle, protect, GetLastError() );
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    adjust    = offset % mPageSize;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    adjOffset = offset - adjust;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    adjLength = length + adjust;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mBasePtr = MapViewOfFile( mFileMapping,
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              readOnly ? FILE_MAP_READ : FILE_MAP_ALL_ACCESS,
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              0,
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              (DWORD)(adjOffset),
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                              adjLength );
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mBasePtr == NULL) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("MapViewOfFile(%ld, %ld) failed with error %ld\n",
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project              adjOffset, adjLength, GetLastError() );
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CloseHandle(mFileMapping);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFileMapping = INVALID_HANDLE_VALUE;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_POSIX_FILEMAP
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int     prot, flags, adjust;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    off_t   adjOffset;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t  adjLength;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* ptr;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    assert(mRefCount == 1);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    assert(fd >= 0);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    assert(offset >= 0);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    assert(length > 0);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* init on first use */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mPageSize == -1) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if NOT_USING_KLIBC
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPageSize = sysconf(_SC_PAGESIZE);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPageSize == -1) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGE("could not get _SC_PAGESIZE\n");
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* this holds for Linux, Darwin, Cygwin, and doesn't pain the ARM */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPageSize = 4096;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    adjust   = offset % mPageSize;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttry_again:
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    adjOffset = offset - adjust;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    adjLength = length + adjust;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    flags = MAP_SHARED;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    prot = PROT_READ;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!readOnly)
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        prot |= PROT_WRITE;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ptr = mmap(NULL, adjLength, prot, flags, fd, adjOffset);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ptr == MAP_FAILED) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	// Cygwin does not seem to like file mapping files from an offset.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	// So if we fail, try again with offset zero
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	if (adjOffset > 0) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    		adjust = offset;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    		goto try_again;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	}
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGE("mmap(%ld,%ld) failed: %s\n",
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (long) adjOffset, (long) adjLength, strerror(errno));
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mBasePtr = ptr;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /* HAVE_POSIX_FILEMAP */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mFileName = origFileName != NULL ? strdup(origFileName) : NULL;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mBaseLength = adjLength;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDataOffset = offset;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDataPtr = (char*) mBasePtr + adjust;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mDataLength = length;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    assert(mBasePtr != NULL);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("MAP: base %p/%d data %p/%d\n",
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBasePtr, (int) mBaseLength, mDataPtr, (int) mDataLength);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return true;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Provide guidance to the system.
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint FileMap::advise(MapAdvice advice)
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if HAVE_MADVISE
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int cc, sysAdvice;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (advice) {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case NORMAL:        sysAdvice = MADV_NORMAL;        break;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case RANDOM:        sysAdvice = MADV_RANDOM;        break;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case SEQUENTIAL:    sysAdvice = MADV_SEQUENTIAL;    break;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case WILLNEED:      sysAdvice = MADV_WILLNEED;      break;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DONTNEED:      sysAdvice = MADV_DONTNEED;      break;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            assert(false);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return -1;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    cc = madvise(mBasePtr, mBaseLength, sysAdvice);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (cc != 0)
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGW("madvise(%d) failed: %s\n", sysAdvice, strerror(errno));
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return cc;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	return -1;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // HAVE_MADVISE
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
223