| /* |
| * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| * Boston, MA 02110-1301 USA |
| * |
| */ |
| |
| #include "config.h" |
| |
| #include "ExecutableAllocator.h" |
| |
| #if ENABLE(ASSEMBLER) && OS(SYMBIAN) |
| |
| #include <e32hal.h> |
| #include <e32std.h> |
| |
| // Set the page size to 256 Kb to compensate for moving memory model limitation |
| const size_t MOVING_MEM_PAGE_SIZE = 256 * 1024; |
| |
| namespace JSC { |
| |
| void ExecutableAllocator::intializePageSize() |
| { |
| #if CPU(ARMV5_OR_LOWER) |
| // The moving memory model (as used in ARMv5 and earlier platforms) |
| // on Symbian OS limits the number of chunks for each process to 16. |
| // To mitigate this limitation increase the pagesize to |
| // allocate less of larger chunks. |
| ExecutableAllocator::pageSize = MOVING_MEM_PAGE_SIZE; |
| #else |
| TInt page_size; |
| UserHal::PageSizeInBytes(page_size); |
| ExecutableAllocator::pageSize = page_size; |
| #endif |
| } |
| |
| ExecutablePool::Allocation ExecutablePool::systemAlloc(size_t n) |
| { |
| RChunk* codeChunk = new RChunk(); |
| |
| TInt errorCode = codeChunk->CreateLocalCode(n, n); |
| |
| char* allocation = reinterpret_cast<char*>(codeChunk->Base()); |
| if (!allocation) |
| CRASH(); |
| ExecutablePool::Allocation alloc = { allocation, n, codeChunk }; |
| return alloc; |
| } |
| |
| void ExecutablePool::systemRelease(const ExecutablePool::Allocation& alloc) |
| { |
| alloc.chunk->Close(); |
| delete alloc.chunk; |
| } |
| |
| #if ENABLE(ASSEMBLER_WX_EXCLUSIVE) |
| #error "ASSEMBLER_WX_EXCLUSIVE not yet suported on this platform." |
| #endif |
| |
| } |
| |
| #endif // HAVE(ASSEMBLER) |