src/hotspot/share/gc/z/zTracer.cpp
changeset 50749 41a5b2de5ad3
parent 50525 767cdb97f103
child 53407 690aed53fef0
--- a/src/hotspot/share/gc/z/zTracer.cpp	Mon Jun 25 10:41:03 2018 +0200
+++ b/src/hotspot/share/gc/z/zTracer.cpp	Mon Jun 25 10:54:55 2018 +0200
@@ -28,6 +28,44 @@
 #include "gc/shared/gcLocker.hpp"
 #include "jfr/jfrEvents.hpp"
 #include "runtime/safepointVerifiers.hpp"
+#if INCLUDE_JFR
+#include "jfr/metadata/jfrSerializer.hpp"
+#endif
+
+#if INCLUDE_JFR
+class ZStatisticsCounterTypeConstant : public JfrSerializer {
+public:
+  virtual void serialize(JfrCheckpointWriter& writer) {
+    writer.write_count(ZStatCounter::count());
+    for (ZStatCounter* counter = ZStatCounter::first(); counter != NULL; counter = counter->next()) {
+      writer.write_key(counter->id());
+      writer.write(counter->name());
+    }
+  }
+};
+
+class ZStatisticsSamplerTypeConstant : public JfrSerializer {
+public:
+  virtual void serialize(JfrCheckpointWriter& writer) {
+    writer.write_count(ZStatSampler::count());
+    for (ZStatSampler* sampler = ZStatSampler::first(); sampler != NULL; sampler = sampler->next()) {
+      writer.write_key(sampler->id());
+      writer.write(sampler->name());
+    }
+  }
+};
+
+static void register_jfr_type_serializers() {
+  JfrSerializer::register_serializer(TYPE_ZSTATISTICSCOUNTERTYPE,
+                                     false /* require_safepoint */,
+                                     true /* permit_cache */,
+                                     new ZStatisticsCounterTypeConstant());
+  JfrSerializer::register_serializer(TYPE_ZSTATISTICSSAMPLERTYPE,
+                                     false /* require_safepoint */,
+                                     true /* permit_cache */,
+                                     new ZStatisticsSamplerTypeConstant());
+}
+#endif
 
 ZTracer* ZTracer::_tracer = NULL;
 
@@ -35,7 +73,9 @@
     GCTracer(Z) {}
 
 void ZTracer::initialize() {
+  assert(_tracer == NULL, "Already initialized");
   _tracer = new (ResourceObj::C_HEAP, mtGC) ZTracer();
+  JFR_ONLY(register_jfr_type_serializers());
 }
 
 void ZTracer::send_stat_counter(uint32_t counter_id, uint64_t increment, uint64_t value) {