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
36class JvmtiTagHashmap;
37class JvmtiTagHashmapEntry;
38class JvmtiTagHashmapEntryClosure;
39
40class 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