1 /* 2 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 // JvmtiTagMap 26 27 #ifndef SHARE_VM_PRIMS_JVMTITAGMAP_HPP 28 #define SHARE_VM_PRIMS_JVMTITAGMAP_HPP 29 30 #ifndef JVMTI_KERNEL 31 #include "gc_interface/collectedHeap.hpp" 32 #include "jvmtifiles/jvmti.h" 33 #include "jvmtifiles/jvmtiEnv.hpp" 34 #include "memory/allocation.hpp" 35 #include "memory/genCollectedHeap.hpp" 36 #include "memory/universe.hpp" 37 #endif 38 39 // forward references 40 class JvmtiTagHashmap; 41 class JvmtiTagHashmapEntry; 42 class JvmtiTagHashmapEntryClosure; 43 44 class JvmtiTagMap : public CHeapObj { 45 private: 46 47 enum{ 48 n_hashmaps = 2, // encapsulates 2 hashmaps 49 max_free_entries = 4096 // maximum number of free entries per env 50 }; 51 52 // memory region for young generation 53 static MemRegion _young_gen; 54 static void get_young_generation(); 55 56 JvmtiEnv* _env; // the jvmti environment 57 Mutex _lock; // lock for this tag map 58 JvmtiTagHashmap* _hashmap[n_hashmaps]; // the hashmaps 59 60 JvmtiTagHashmapEntry* _free_entries; // free list for this environment 61 int _free_entries_count; // number of entries on the free list 62 63 // create a tag map 64 JvmtiTagMap(JvmtiEnv* env); 65 66 // accessors 67 inline Mutex* lock() { return &_lock; } 68 inline JvmtiEnv* env() const { return _env; } 69 70 // rehash tags maps for generation start to end 71 void rehash(int start, int end); 72 73 // indicates if the object is in the young generation 74 static bool is_in_young(oop o); 75 76 // iterate over all entries in this tag map 77 void entry_iterate(JvmtiTagHashmapEntryClosure* closure); 78 79 public: 80 81 // indicates if this tag map is locked 82 bool is_locked() { return lock()->is_locked(); } 83 84 // return the appropriate hashmap for a given object 85 JvmtiTagHashmap* hashmap_for(oop o); 86 87 // create/destroy entries 88 JvmtiTagHashmapEntry* create_entry(jweak ref, jlong tag); 89 void destroy_entry(JvmtiTagHashmapEntry* entry); 90 91 // returns true if the hashmaps are empty 92 bool is_empty(); 93 94 // return tag for the given environment 95 static JvmtiTagMap* tag_map_for(JvmtiEnv* env); 96 97 // destroy tag map 98 ~JvmtiTagMap(); 99 100 // set/get tag 101 void set_tag(jobject obj, jlong tag); 102 jlong get_tag(jobject obj); 103 104 // deprecated heap iteration functions 105 void iterate_over_heap(jvmtiHeapObjectFilter object_filter, 106 KlassHandle klass, 107 jvmtiHeapObjectCallback heap_object_callback, 108 const void* user_data); 109 110 void iterate_over_reachable_objects(jvmtiHeapRootCallback heap_root_callback, 111 jvmtiStackReferenceCallback stack_ref_callback, 112 jvmtiObjectReferenceCallback object_ref_callback, 113 const void* user_data); 114 115 void iterate_over_objects_reachable_from_object(jobject object, 116 jvmtiObjectReferenceCallback object_reference_callback, 117 const void* user_data); 118 119 120 // advanced (JVMTI 1.1) heap iteration functions 121 void iterate_through_heap(jint heap_filter, 122 KlassHandle klass, 123 const jvmtiHeapCallbacks* callbacks, 124 const void* user_data); 125 126 void follow_references(jint heap_filter, 127 KlassHandle klass, 128 jobject initial_object, 129 const jvmtiHeapCallbacks* callbacks, 130 const void* user_data); 131 132 // get tagged objects 133 jvmtiError get_objects_with_tags(const jlong* tags, jint count, 134 jint* count_ptr, jobject** object_result_ptr, 135 jlong** tag_result_ptr); 136 137 // call post-GC to rehash the tag maps. 138 static void gc_epilogue(bool full); 139 140 // call after referencing processing has completed (CMS) 141 static void cms_ref_processing_epilogue(); 142 }; 143 144 #endif // SHARE_VM_PRIMS_JVMTITAGMAP_HPP