1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * Maintain a table of references. Used for internal local references, 19 * JNI monitor references, and JNI pinned array references. 20 * 21 * None of the table functions are synchronized. 22 */ 23 #ifndef DALVIK_REFERENCETABLE_H_ 24 #define DALVIK_REFERENCETABLE_H_ 25 26 /* 27 * Table definition. 28 * 29 * The expected common operations are adding a new entry and removing a 30 * recently-added entry (usually the most-recently-added entry). 31 * 32 * If "allocEntries" is not equal to "maxEntries", the table may expand when 33 * entries are added, which means the memory may move. If you want to keep 34 * pointers into "table" rather than offsets, use a fixed-size table. 35 * 36 * (This structure is still somewhat transparent; direct access to 37 * table/nextEntry is allowed.) 38 */ 39 struct ReferenceTable { 40 Object** nextEntry; /* top of the list */ 41 Object** table; /* bottom of the list */ 42 43 int allocEntries; /* #of entries we have space for */ 44 int maxEntries; /* max #of entries allowed */ 45 }; 46 47 /* 48 * Initialize a ReferenceTable. 49 * 50 * If "initialCount" != "maxCount", the table will expand as required. 51 * 52 * Returns "false" if table allocation fails. 53 */ 54 bool dvmInitReferenceTable(ReferenceTable* pRef, int initialCount, 55 int maxCount); 56 57 /* 58 * Clears out the contents of a ReferenceTable, freeing allocated storage. 59 * Does not free "pRef". 60 * 61 * You must call dvmInitReferenceTable() before you can re-use this table. 62 */ 63 void dvmClearReferenceTable(ReferenceTable* pRef); 64 65 /* 66 * Return the #of entries currently stored in the ReferenceTable. 67 */ 68 INLINE size_t dvmReferenceTableEntries(const ReferenceTable* pRef) 69 { 70 return pRef->nextEntry - pRef->table; 71 } 72 73 /* 74 * Returns "true" if the table is full. The table is considered full if 75 * we would need to expand it to add another entry. 76 */ 77 INLINE size_t dvmIsReferenceTableFull(const ReferenceTable* pRef) 78 { 79 return dvmReferenceTableEntries(pRef) == (size_t)pRef->allocEntries; 80 } 81 82 /* 83 * Add a new entry. "obj" must be a valid non-NULL object reference 84 * (though it's okay if it's not fully-formed, e.g. the result from 85 * dvmMalloc doesn't have obj->clazz set). 86 * 87 * Returns "false" if the table is full. 88 */ 89 bool dvmAddToReferenceTable(ReferenceTable* pRef, Object* obj); 90 91 /* 92 * Determine if "obj" is present in "pRef". Stops searching when we hit 93 * "bottom". To include the entire table, pass in "pRef->table" as the 94 * bottom. 95 * 96 * Returns NULL if "obj" was not found. 97 */ 98 Object** dvmFindInReferenceTable(const ReferenceTable* pRef, Object** bottom, 99 Object* obj); 100 101 /* 102 * Remove an existing entry. 103 * 104 * We stop searching for a match after examining the element at "bottom". 105 * This is useful when entries are associated with a stack frame. 106 * 107 * Returns "false" if the entry was not found. 108 */ 109 bool dvmRemoveFromReferenceTable(ReferenceTable* pRef, Object** bottom, 110 Object* obj); 111 112 /* 113 * Dump the contents of a reference table to the log file. 114 * 115 * The caller should lock any external sync before calling. 116 */ 117 void dvmDumpReferenceTable(const ReferenceTable* pRef, const char* descr); 118 119 /* 120 * Internal function, shared with IndirectRefTable. 121 */ 122 void dvmDumpReferenceTableContents(Object* const* refs, size_t count, 123 const char* descr); 124 125 #endif // DALVIK_REFERENCETABLE_H_ 126