LinearAlloc.h revision 7605a84a9a0a1764c1fb290d9c93e8114eaf620a
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Simple linear memory allocator. 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _DALVIK_LINEARALLOC 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define _DALVIK_LINEARALLOC 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If this is set, we create additional data structures and make many 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * additional mprotect() calls. 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (this breaks the debugger because the debugBreakpointCount cannot be updated) 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ENFORCE_READ_ONLY false 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Linear allocation state. We could tuck this into the start of the 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * allocated region, but that would prevent us from sharing the rest of 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that first page. 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef struct LinearAllocHdr { 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int curOffset; /* offset where next data goes */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutex_t lock; /* controls updates to this struct */ 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* mapAddr; /* start of mmap()ed region */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int mapLength; /* length of region */ 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int firstOffset; /* for chasing through */ 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project short* writeRefCount; /* for ENFORCE_READ_ONLY */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} LinearAllocHdr; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new alloc region. 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectLinearAllocHdr* dvmLinearAllocCreate(Object* classLoader); 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Destroy a region. 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearAllocDestroy(Object* classLoader); 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allocate a chunk of memory. The memory will be zeroed out. 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For ENFORCE_READ_ONLY, call dvmLinearReadOnly on the result. 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid* dvmLinearAlloc(Object* classLoader, size_t size); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reallocate a chunk. The original storage is not released, but may be 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * erased to aid debugging. 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For ENFORCE_READ_ONLY, call dvmLinearReadOnly on the result. Also, the 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * caller should probably mark the "mem" argument read-only before calling. 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid* dvmLinearRealloc(Object* classLoader, void* mem, size_t newSize); 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* don't call these directly */ 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearSetReadOnly(Object* classLoader, void* mem); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearSetReadWrite(Object* classLoader, void* mem); 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Mark a chunk of memory from Alloc or Realloc as read-only. This must 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be done after all changes to the block of memory have been made. This 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * actually operates on a page granularity. 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmLinearReadOnly(Object* classLoader, void* mem) 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (ENFORCE_READ_ONLY && mem != NULL) 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmLinearSetReadOnly(classLoader, mem); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Make a chunk of memory writable again. 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmLinearReadWrite(Object* classLoader, void* mem) 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (ENFORCE_READ_ONLY && mem != NULL) 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmLinearSetReadWrite(classLoader, mem); 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Free a chunk. Does not increase available storage, but the freed area 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * may be erased to aid debugging. 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearFree(Object* classLoader, void* mem); 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper function; allocates new storage and copies "str" into it. 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For ENFORCE_READ_ONLY, do *not* call dvmLinearReadOnly on the result. 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is done automatically. 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmLinearStrdup(Object* classLoader, const char* str); 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dump the contents of a linear alloc area. 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearAllocDump(Object* classLoader); 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1157605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden/* 1167605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden * Determine if [start, start+length) is contained in the in-use area of 1177605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden * a single LinearAlloc. The full set of linear allocators is scanned. 1187605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden */ 1197605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFaddenbool dvmLinearAllocContains(void* start, size_t length); 1207605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*_DALVIK_LINEARALLOC*/ 122