1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "SuperRegion.h" 28 29#include "Region.h" 30 31namespace JSC { 32 33const uint64_t SuperRegion::s_fixedHeapMemoryPoolSize = 4 * 1024 * static_cast<uint64_t>(MB); 34 35SuperRegion::SuperRegion() 36 : MetaAllocator(Region::s_regionSize, Region::s_regionSize) 37 , m_reservationBase(0) 38{ 39#if ENABLE(SUPER_REGION) 40 // Over-allocate so that we can make sure that we're aligned to the size of Regions. 41 m_reservation = PageReservation::reserve(s_fixedHeapMemoryPoolSize + Region::s_regionSize, OSAllocator::JSGCHeapPages); 42 m_reservationBase = getAlignedBase(m_reservation); 43 addFreshFreeSpace(m_reservationBase, s_fixedHeapMemoryPoolSize); 44#else 45 UNUSED_PARAM(m_reservation); 46 UNUSED_PARAM(m_reservationBase); 47#endif 48} 49 50SuperRegion::~SuperRegion() 51{ 52#if ENABLE(SUPER_REGION) 53 m_reservation.deallocate(); 54#endif 55} 56 57void* SuperRegion::getAlignedBase(PageReservation& reservation) 58{ 59 for (char* current = static_cast<char*>(reservation.base()); current < static_cast<char*>(reservation.base()) + Region::s_regionSize; current += pageSize()) { 60 if (!(reinterpret_cast<size_t>(current) & ~Region::s_regionMask)) 61 return current; 62 } 63 ASSERT_NOT_REACHED(); 64 return 0; 65} 66 67void* SuperRegion::allocateNewSpace(size_t&) 68{ 69 return 0; 70} 71 72void SuperRegion::notifyNeedPage(void* page) 73{ 74 m_reservation.commit(page, Region::s_regionSize); 75} 76 77void SuperRegion::notifyPageIsFree(void* page) 78{ 79 m_reservation.decommit(page, Region::s_regionSize); 80} 81 82} // namespace JSC 83