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