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 */ 19375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_LINEARALLOC_H_ 20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_LINEARALLOC_H_ 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 */ 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ENFORCE_READ_ONLY false 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Linear allocation state. We could tuck this into the start of the 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * allocated region, but that would prevent us from sharing the rest of 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * that first page. 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 33d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct LinearAllocHdr { 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int curOffset; /* offset where next data goes */ 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project pthread_mutex_t lock; /* controls updates to this struct */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project char* mapAddr; /* start of mmap()ed region */ 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int mapLength; /* length of region */ 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int firstOffset; /* for chasing through */ 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project short* writeRefCount; /* for ENFORCE_READ_ONLY */ 42d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro}; 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new alloc region. 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectLinearAllocHdr* dvmLinearAllocCreate(Object* classLoader); 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Destroy a region. 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearAllocDestroy(Object* classLoader); 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Allocate a chunk of memory. The memory will be zeroed out. 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For ENFORCE_READ_ONLY, call dvmLinearReadOnly on the result. 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid* dvmLinearAlloc(Object* classLoader, size_t size); 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reallocate a chunk. The original storage is not released, but may be 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * erased to aid debugging. 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For ENFORCE_READ_ONLY, call dvmLinearReadOnly on the result. Also, the 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * caller should probably mark the "mem" argument read-only before calling. 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid* dvmLinearRealloc(Object* classLoader, void* mem, size_t newSize); 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* don't call these directly */ 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearSetReadOnly(Object* classLoader, void* mem); 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearSetReadWrite(Object* classLoader, void* mem); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Mark a chunk of memory from Alloc or Realloc as read-only. This must 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be done after all changes to the block of memory have been made. This 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * actually operates on a page granularity. 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmLinearReadOnly(Object* classLoader, void* mem) 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (ENFORCE_READ_ONLY && mem != NULL) 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmLinearSetReadOnly(classLoader, mem); 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Make a chunk of memory writable again. 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE void dvmLinearReadWrite(Object* classLoader, void* mem) 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (ENFORCE_READ_ONLY && mem != NULL) 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmLinearSetReadWrite(classLoader, mem); 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Free a chunk. Does not increase available storage, but the freed area 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * may be erased to aid debugging. 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearFree(Object* classLoader, void* mem); 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper function; allocates new storage and copies "str" into it. 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For ENFORCE_READ_ONLY, do *not* call dvmLinearReadOnly on the result. 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is done automatically. 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchar* dvmLinearStrdup(Object* classLoader, const char* str); 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dump the contents of a linear alloc area. 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmLinearAllocDump(Object* classLoader); 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 1147605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden/* 1157605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden * Determine if [start, start+length) is contained in the in-use area of 1167605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden * a single LinearAlloc. The full set of linear allocators is scanned. 1177605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden */ 118cdacef5836df5fd69488d627e4d0db7cd3a86faeBob Leebool dvmLinearAllocContains(const void* start, size_t length); 1197605a84a9a0a1764c1fb290d9c93e8114eaf620aAndy McFadden 120375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif // DALVIK_LINEARALLOC_H_ 121