< prev index next >

src/hotspot/share/jfr/recorder/stringpool/jfrStringPool.cpp

Print this page




  29 #include "jfr/recorder/storage/jfrMemorySpace.inline.hpp"
  30 #include "jfr/recorder/repository/jfrChunkWriter.hpp"
  31 #include "jfr/recorder/storage/jfrStorageUtils.inline.hpp"
  32 #include "jfr/recorder/stringpool/jfrStringPool.hpp"
  33 #include "jfr/recorder/stringpool/jfrStringPoolWriter.hpp"
  34 #include "jfr/utilities/jfrTypes.hpp"
  35 #include "logging/log.hpp"
  36 #include "runtime/mutexLocker.hpp"
  37 #include "runtime/orderAccess.hpp"
  38 #include "runtime/safepoint.hpp"
  39 #include "runtime/thread.inline.hpp"
  40 
  41 typedef JfrStringPool::Buffer* BufferPtr;
  42 
  43 static JfrStringPool* _instance = NULL;
  44 static uint64_t store_generation = 0;
  45 static uint64_t serialized_generation = 0;
  46 
  47 inline void set_generation(uint64_t value, uint64_t* const dest) {
  48   assert(dest != NULL, "invariant");
  49   OrderAccess::release_store(dest, value);
  50 }
  51 static void increment_store_generation() {
  52   const uint64_t current_serialized = OrderAccess::load_acquire(&serialized_generation);
  53   const uint64_t current_stored = OrderAccess::load_acquire(&store_generation);
  54   if (current_serialized == current_stored) {
  55     set_generation(current_serialized + 1, &store_generation);
  56   }
  57 }
  58 
  59 static bool increment_serialized_generation() {
  60   const uint64_t current_stored = OrderAccess::load_acquire(&store_generation);
  61   const uint64_t current_serialized = OrderAccess::load_acquire(&serialized_generation);
  62   if (current_stored != current_serialized) {
  63     set_generation(current_stored, &serialized_generation);
  64     return true;
  65   }
  66   return false;
  67 }
  68 
  69 bool JfrStringPool::is_modified() {
  70   return increment_serialized_generation();
  71 }
  72 
  73 JfrStringPool& JfrStringPool::instance() {
  74   return *_instance;
  75 }
  76 
  77 JfrStringPool* JfrStringPool::create(JfrChunkWriter& cw) {
  78   store_generation = 0;
  79   serialized_generation = 0;
  80   assert(_instance == NULL, "invariant");
  81   _instance = new JfrStringPool(cw);




  29 #include "jfr/recorder/storage/jfrMemorySpace.inline.hpp"
  30 #include "jfr/recorder/repository/jfrChunkWriter.hpp"
  31 #include "jfr/recorder/storage/jfrStorageUtils.inline.hpp"
  32 #include "jfr/recorder/stringpool/jfrStringPool.hpp"
  33 #include "jfr/recorder/stringpool/jfrStringPoolWriter.hpp"
  34 #include "jfr/utilities/jfrTypes.hpp"
  35 #include "logging/log.hpp"
  36 #include "runtime/mutexLocker.hpp"
  37 #include "runtime/orderAccess.hpp"
  38 #include "runtime/safepoint.hpp"
  39 #include "runtime/thread.inline.hpp"
  40 
  41 typedef JfrStringPool::Buffer* BufferPtr;
  42 
  43 static JfrStringPool* _instance = NULL;
  44 static uint64_t store_generation = 0;
  45 static uint64_t serialized_generation = 0;
  46 
  47 inline void set_generation(uint64_t value, uint64_t* const dest) {
  48   assert(dest != NULL, "invariant");
  49   Atomic::release_store(dest, value);
  50 }
  51 static void increment_store_generation() {
  52   const uint64_t current_serialized = Atomic::load_acquire(&serialized_generation);
  53   const uint64_t current_stored = Atomic::load_acquire(&store_generation);
  54   if (current_serialized == current_stored) {
  55     set_generation(current_serialized + 1, &store_generation);
  56   }
  57 }
  58 
  59 static bool increment_serialized_generation() {
  60   const uint64_t current_stored = Atomic::load_acquire(&store_generation);
  61   const uint64_t current_serialized = Atomic::load_acquire(&serialized_generation);
  62   if (current_stored != current_serialized) {
  63     set_generation(current_stored, &serialized_generation);
  64     return true;
  65   }
  66   return false;
  67 }
  68 
  69 bool JfrStringPool::is_modified() {
  70   return increment_serialized_generation();
  71 }
  72 
  73 JfrStringPool& JfrStringPool::instance() {
  74   return *_instance;
  75 }
  76 
  77 JfrStringPool* JfrStringPool::create(JfrChunkWriter& cw) {
  78   store_generation = 0;
  79   serialized_generation = 0;
  80   assert(_instance == NULL, "invariant");
  81   _instance = new JfrStringPool(cw);


< prev index next >