src/share/vm/jfr/recorder/checkpoint/types/jfrTypeSetWriter.hpp

Mon, 19 Aug 2019 10:11:31 +0200

author
neugens
date
Mon, 19 Aug 2019 10:11:31 +0200
changeset 9861
a248d0be1309
parent 9858
b985cbb00e68
child 9947
db357034b763
permissions
-rw-r--r--

8229401: Fix JFR code cache test failures
8223689: Add JFR Thread Sampling Support
8223690: Add JFR BiasedLock Event Support
8223691: Add JFR G1 Region Type Change Event Support
8223692: Add JFR G1 Heap Summary Event Support
Summary: Backport JFR from JDK11, additional fixes
Reviewed-by: neugens, apetushkov
Contributed-by: denghui.ddh@alibaba-inc.com

apetushkov@9858 1 /*
apetushkov@9858 2 * Copyright (c) 2017, 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_JFR_CHECKPOINT_TYPES_JFRTYPESETWRITER_HPP
apetushkov@9858 26 #define SHARE_VM_JFR_CHECKPOINT_TYPES_JFRTYPESETWRITER_HPP
apetushkov@9858 27
apetushkov@9858 28 #include "jfr/recorder/checkpoint/jfrCheckpointWriter.hpp"
apetushkov@9858 29 #include "jfr/utilities/jfrTypes.hpp"
apetushkov@9858 30 #include "memory/allocation.hpp"
apetushkov@9858 31
apetushkov@9858 32 template <typename WriterImpl, u4 ID>
apetushkov@9858 33 class JfrArtifactWriterHost : public StackObj {
apetushkov@9858 34 private:
apetushkov@9858 35 WriterImpl _impl;
apetushkov@9858 36 JfrCheckpointWriter* _writer;
apetushkov@9858 37 JfrCheckpointContext _ctx;
apetushkov@9858 38 jlong _count_offset;
apetushkov@9858 39 int _count;
apetushkov@9858 40 bool _skip_header;
apetushkov@9858 41 public:
apetushkov@9858 42 JfrArtifactWriterHost(JfrCheckpointWriter* writer,
apetushkov@9858 43 JfrArtifactSet* artifacts,
apetushkov@9858 44 bool class_unload,
apetushkov@9858 45 bool skip_header = false) : _impl(writer, artifacts, class_unload),
apetushkov@9858 46 _writer(writer),
apetushkov@9858 47 _ctx(writer->context()),
apetushkov@9858 48 _count(0),
apetushkov@9858 49 _skip_header(skip_header) {
apetushkov@9858 50 assert(_writer != NULL, "invariant");
apetushkov@9858 51 if (!_skip_header) {
apetushkov@9858 52 _writer->write_type((JfrTypeId)ID);
apetushkov@9858 53 _count_offset = _writer->reserve(sizeof(u4)); // Don't know how many yet
apetushkov@9858 54 }
apetushkov@9858 55 }
apetushkov@9858 56
apetushkov@9858 57 ~JfrArtifactWriterHost() {
apetushkov@9858 58 if (_count == 0) {
apetushkov@9858 59 // nothing written, restore context for rewind
apetushkov@9858 60 _writer->set_context(_ctx);
apetushkov@9858 61 return;
apetushkov@9858 62 }
apetushkov@9858 63 assert(_count > 0, "invariant");
apetushkov@9858 64 if (!_skip_header) {
apetushkov@9858 65 _writer->write_count(_count, _count_offset);
apetushkov@9858 66 }
apetushkov@9858 67 }
apetushkov@9858 68
apetushkov@9858 69 bool operator()(typename WriterImpl::Type const & value) {
apetushkov@9858 70 this->_count += _impl(value);
apetushkov@9858 71 return true;
apetushkov@9858 72 }
apetushkov@9858 73
apetushkov@9858 74 int count() const { return _count; }
apetushkov@9858 75 void add(int count) { _count += count; }
apetushkov@9858 76 };
apetushkov@9858 77
apetushkov@9858 78 typedef int(*artifact_write_operation)(JfrCheckpointWriter*, JfrArtifactSet*, const void*);
apetushkov@9858 79
apetushkov@9858 80 template <typename T, artifact_write_operation op>
apetushkov@9858 81 class JfrArtifactWriterImplHost {
apetushkov@9858 82 private:
apetushkov@9858 83 JfrCheckpointWriter* _writer;
apetushkov@9858 84 JfrArtifactSet* _artifacts;
apetushkov@9858 85 bool _class_unload;
apetushkov@9858 86 public:
apetushkov@9858 87 typedef T Type;
apetushkov@9858 88 JfrArtifactWriterImplHost(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, bool class_unload) :
apetushkov@9858 89 _writer(writer), _artifacts(artifacts), _class_unload(class_unload) {}
apetushkov@9858 90 int operator()(T const& value) {
apetushkov@9858 91 return op(this->_writer, this->_artifacts, value);
apetushkov@9858 92 }
apetushkov@9858 93 };
apetushkov@9858 94
apetushkov@9858 95 template <typename T, typename Predicate, artifact_write_operation op>
apetushkov@9858 96 class JfrPredicatedArtifactWriterImplHost : public JfrArtifactWriterImplHost<T, op> {
apetushkov@9858 97 private:
apetushkov@9858 98 Predicate _predicate;
apetushkov@9858 99 typedef JfrArtifactWriterImplHost<T, op> Parent;
apetushkov@9858 100 public:
apetushkov@9858 101 JfrPredicatedArtifactWriterImplHost(JfrCheckpointWriter* writer, JfrArtifactSet* artifacts, bool class_unload) :
apetushkov@9858 102 Parent(writer, artifacts, class_unload), _predicate(class_unload) {}
apetushkov@9858 103 int operator()(T const& value) {
apetushkov@9858 104 return _predicate(value) ? Parent::operator()(value) : 0;
apetushkov@9858 105 }
apetushkov@9858 106 };
apetushkov@9858 107
apetushkov@9858 108 #endif // SHARE_VM_JFR_CHECKPOINT_TYPES_JFRTYPESETWRITER_HPP

mercurial