/* * Copyright (C) 2010 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "OSAllocator.h" #if OS(UNIX) && !OS(SYMBIAN) #include #include #include #include namespace WTF { void* OSAllocator::reserve(size_t bytes) { // From a bookkeeping perspective, POSIX reservations start out in the committed state. void* result = mmap(0, bytes, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); if (result == MAP_FAILED) CRASH(); #if HAVE(MADV_FREE_REUSE) while (madvise(result, bytes, MADV_FREE_REUSABLE) == -1 && errno == EAGAIN) { } #endif return result; } void* OSAllocator::reserveAndCommit(size_t bytes) { // From a bookkeeping perspective, POSIX reservations start out in the committed state. return reserve(bytes); } void OSAllocator::commit(void* address, size_t bytes) { #if HAVE(MADV_FREE_REUSE) while (madvise(address, bytes, MADV_FREE_REUSE) == -1 && errno == EAGAIN) { } #else UNUSED_PARAM(address); UNUSED_PARAM(bytes); #endif } void OSAllocator::decommit(void* address, size_t bytes) { #if HAVE(MADV_FREE_REUSE) while (madvise(address, bytes, MADV_FREE_REUSABLE) == -1 && errno == EAGAIN) { } #elif HAVE(MADV_FREE) while (madvise(address, bytes, MADV_FREE) == -1 && errno == EAGAIN) { } #elif HAVE(MADV_DONTNEED) while (madvise(address, bytes, MADV_DONTNEED) == -1 && errno == EAGAIN) { } #else UNUSED_PARAM(address); UNUSED_PARAM(bytes); #endif } void OSAllocator::release(void* address, size_t bytes) { munmap(address, bytes); } } // namespace WTF #endif