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