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