src/share/vm/jfr/leakprofiler/chains/edgeStore.hpp

Mon, 12 Aug 2019 18:30:40 +0300

author
apetushkov
date
Mon, 12 Aug 2019 18:30:40 +0300
changeset 9858
b985cbb00e68
child 9885
8e875c964f41
permissions
-rw-r--r--

8223147: JFR Backport
8199712: Flight Recorder
8203346: JFR: Inconsistent signature of jfr_add_string_constant
8195817: JFR.stop should require name of recording
8195818: JFR.start should increase autogenerated name by one
8195819: Remove recording=x from jcmd JFR.check output
8203921: JFR thread sampling is missing fixes from JDK-8194552
8203929: Limit amount of data for JFR.dump
8203664: JFR start failure after AppCDS archive created with JFR StartFlightRecording
8003209: JFR events for network utilization
8207392: [PPC64] Implement JFR profiling
8202835: jfr/event/os/TestSystemProcess.java fails on missing events
Summary: Backport JFR from JDK11. Initial integration
Reviewed-by: neugens

apetushkov@9858 1 /*
apetushkov@9858 2 * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
apetushkov@9858 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
apetushkov@9858 4 *
apetushkov@9858 5 * This code is free software; you can redistribute it and/or modify it
apetushkov@9858 6 * under the terms of the GNU General Public License version 2 only, as
apetushkov@9858 7 * published by the Free Software Foundation.
apetushkov@9858 8 *
apetushkov@9858 9 * This code is distributed in the hope that it will be useful, but WITHOUT
apetushkov@9858 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
apetushkov@9858 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
apetushkov@9858 12 * version 2 for more details (a copy is included in the LICENSE file that
apetushkov@9858 13 * accompanied this code).
apetushkov@9858 14 *
apetushkov@9858 15 * You should have received a copy of the GNU General Public License version
apetushkov@9858 16 * 2 along with this work; if not, write to the Free Software Foundation,
apetushkov@9858 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
apetushkov@9858 18 *
apetushkov@9858 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
apetushkov@9858 20 * or visit www.oracle.com if you need additional information or have any
apetushkov@9858 21 * questions.
apetushkov@9858 22 *
apetushkov@9858 23 */
apetushkov@9858 24
apetushkov@9858 25 #ifndef SHARE_VM_LEAKPROFILER_CHAINS_EDGESTORE_HPP
apetushkov@9858 26 #define SHARE_VM_LEAKPROFILER_CHAINS_EDGESTORE_HPP
apetushkov@9858 27
apetushkov@9858 28 #include "jfr/utilities/jfrHashtable.hpp"
apetushkov@9858 29 #include "jfr/leakprofiler/chains/edge.hpp"
apetushkov@9858 30 #include "memory/allocation.hpp"
apetushkov@9858 31
apetushkov@9858 32 typedef u8 traceid;
apetushkov@9858 33
apetushkov@9858 34 class RoutableEdge : public Edge {
apetushkov@9858 35 private:
apetushkov@9858 36 mutable const RoutableEdge* _skip_edge;
apetushkov@9858 37 mutable size_t _skip_length;
apetushkov@9858 38 mutable bool _processed;
apetushkov@9858 39
apetushkov@9858 40 public:
apetushkov@9858 41 RoutableEdge();
apetushkov@9858 42 RoutableEdge(const Edge* parent, const oop* reference);
apetushkov@9858 43 RoutableEdge(const Edge& edge);
apetushkov@9858 44 RoutableEdge(const RoutableEdge& edge);
apetushkov@9858 45 void operator=(const RoutableEdge& edge);
apetushkov@9858 46
apetushkov@9858 47 const RoutableEdge* skip_edge() const { return _skip_edge; }
apetushkov@9858 48 size_t skip_length() const { return _skip_length; }
apetushkov@9858 49
apetushkov@9858 50 bool is_skip_edge() const { return _skip_edge != NULL; }
apetushkov@9858 51 bool processed() const { return _processed; }
apetushkov@9858 52 bool is_sentinel() const {
apetushkov@9858 53 return _skip_edge == NULL && _skip_length == 1;
apetushkov@9858 54 }
apetushkov@9858 55
apetushkov@9858 56 void set_skip_edge(const RoutableEdge* edge) const {
apetushkov@9858 57 assert(!is_skip_edge(), "invariant");
apetushkov@9858 58 assert(edge != this, "invariant");
apetushkov@9858 59 _skip_edge = edge;
apetushkov@9858 60 }
apetushkov@9858 61
apetushkov@9858 62 void set_skip_length(size_t length) const {
apetushkov@9858 63 _skip_length = length;
apetushkov@9858 64 }
apetushkov@9858 65
apetushkov@9858 66 void set_processed() const {
apetushkov@9858 67 assert(!_processed, "invariant");
apetushkov@9858 68 _processed = true;
apetushkov@9858 69 }
apetushkov@9858 70
apetushkov@9858 71 // true navigation according to physical tree representation
apetushkov@9858 72 const RoutableEdge* physical_parent() const {
apetushkov@9858 73 return static_cast<const RoutableEdge*>(parent());
apetushkov@9858 74 }
apetushkov@9858 75
apetushkov@9858 76 // logical navigation taking skip levels into account
apetushkov@9858 77 const RoutableEdge* logical_parent() const {
apetushkov@9858 78 return is_skip_edge() ? skip_edge() : physical_parent();
apetushkov@9858 79 }
apetushkov@9858 80
apetushkov@9858 81 size_t logical_distance_to_root() const;
apetushkov@9858 82 };
apetushkov@9858 83
apetushkov@9858 84 class EdgeStore : public CHeapObj<mtTracing> {
apetushkov@9858 85 typedef HashTableHost<RoutableEdge, traceid, Entry, EdgeStore> EdgeHashTable;
apetushkov@9858 86 typedef EdgeHashTable::HashEntry EdgeEntry;
apetushkov@9858 87 template <typename,
apetushkov@9858 88 typename,
apetushkov@9858 89 template<typename, typename> class,
apetushkov@9858 90 typename,
apetushkov@9858 91 size_t>
apetushkov@9858 92 friend class HashTableHost;
apetushkov@9858 93 private:
apetushkov@9858 94 static traceid _edge_id_counter;
apetushkov@9858 95 EdgeHashTable* _edges;
apetushkov@9858 96
apetushkov@9858 97 // Hash table callbacks
apetushkov@9858 98 void assign_id(EdgeEntry* entry);
apetushkov@9858 99 bool equals(const Edge& query, uintptr_t hash, const EdgeEntry* entry);
apetushkov@9858 100
apetushkov@9858 101 const Edge* get_edge(const Edge* edge) const;
apetushkov@9858 102 const Edge* put(const Edge* edge);
apetushkov@9858 103
apetushkov@9858 104 public:
apetushkov@9858 105 EdgeStore();
apetushkov@9858 106 ~EdgeStore();
apetushkov@9858 107
apetushkov@9858 108 void add_chain(const Edge* chain, size_t length);
apetushkov@9858 109 bool is_empty() const;
apetushkov@9858 110 size_t number_of_entries() const;
apetushkov@9858 111
apetushkov@9858 112 traceid get_id(const Edge* edge) const;
apetushkov@9858 113 traceid get_root_id(const Edge* edge) const;
apetushkov@9858 114
apetushkov@9858 115 template <typename T>
apetushkov@9858 116 void iterate_edges(T& functor) const { _edges->iterate_value<T>(functor); }
apetushkov@9858 117 };
apetushkov@9858 118
apetushkov@9858 119 #endif // SHARE_VM_LEAKPROFILER_CHAINS_EDGESTORE_HPP

mercurial