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); |