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