1 /* 2 * Copyright (c) 2003, 2012, 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<mtInternal> { 45 private: 46 47 enum{ 48 max_free_entries = 4096 // maximum number of free entries per env 49 }; 50 51 JvmtiEnv* _env; // the jvmti environment 52 Mutex _lock; // lock for this tag map 53 JvmtiTagHashmap* _hashmap; // the hashmap 54 55 JvmtiTagHashmapEntry* _free_entries; // free list for this environment 56 int _free_entries_count; // number of entries on the free list 57 58 // create a tag map 59 JvmtiTagMap(JvmtiEnv* env); 60 61 // accessors 62 inline Mutex* lock() { return &_lock; } 63 inline JvmtiEnv* env() const { return _env; } 64 65 void do_weak_oops(BoolObjectClosure* is_alive, OopClosure* f); 66 67 // iterate over all entries in this tag map 68 void entry_iterate(JvmtiTagHashmapEntryClosure* closure); 69 70 public: 71 72 // indicates if this tag map is locked 73 bool is_locked() { return lock()->is_locked(); } 74 75 JvmtiTagHashmap* hashmap() { return _hashmap; } 76 77 // create/destroy entries 78 JvmtiTagHashmapEntry* create_entry(oop ref, jlong tag); 79 void destroy_entry(JvmtiTagHashmapEntry* entry); 80 81 // returns true if the hashmaps are empty 82 bool is_empty(); 83 84 // return tag for the given environment 85 static JvmtiTagMap* tag_map_for(JvmtiEnv* env); 86 87 // destroy tag map 88 ~JvmtiTagMap(); 89 90 // set/get tag 91 void set_tag(jobject obj, jlong tag); 92 jlong get_tag(jobject obj); 93 94 // deprecated heap iteration functions 95 void iterate_over_heap(jvmtiHeapObjectFilter object_filter, 96 KlassHandle klass, 97 jvmtiHeapObjectCallback heap_object_callback, 98 const void* user_data); 99 100 void iterate_over_reachable_objects(jvmtiHeapRootCallback heap_root_callback, 101 jvmtiStackReferenceCallback stack_ref_callback, 102 jvmtiObjectReferenceCallback object_ref_callback, 103 const void* user_data); 104 105 void iterate_over_objects_reachable_from_object(jobject object, 106 jvmtiObjectReferenceCallback object_reference_callback, 107 const void* user_data); 108 109 110 // advanced (JVMTI 1.1) heap iteration functions 111 void iterate_through_heap(jint heap_filter, 112 KlassHandle klass, 113 const jvmtiHeapCallbacks* callbacks, 114 const void* user_data); 115 116 void follow_references(jint heap_filter, 117 KlassHandle klass, 118 jobject initial_object, 119 const jvmtiHeapCallbacks* callbacks, 120 const void* user_data); 121 122 // get tagged objects 123 jvmtiError get_objects_with_tags(const jlong* tags, jint count, 124 jint* count_ptr, jobject** object_result_ptr, 125 jlong** tag_result_ptr); 126 127 static void weak_oops_do( 128 BoolObjectClosure* is_alive, OopClosure* f) NOT_JVMTI_RETURN; 129 }; 130 131 #endif // SHARE_VM_PRIMS_JVMTITAGMAP_HPP