8138966: Intermittent SEGV running ParallelGC
authoraph
Wed, 04 Nov 2015 13:38:38 +0100
changeset 33758 aa54610a0b93
parent 33756 fc1eddc092e7
child 33759 8a0e9139a9c5
8138966: Intermittent SEGV running ParallelGC Summary: Add necessary memory fences so that the parallel threads are unable to observe partially filled block tables. Reviewed-by: tschatzl
hotspot/src/share/vm/gc/parallel/psParallelCompact.hpp
--- a/hotspot/src/share/vm/gc/parallel/psParallelCompact.hpp	Tue Nov 03 19:53:10 2015 -0500
+++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.hpp	Wed Nov 04 13:38:38 2015 +0100
@@ -347,7 +347,7 @@
     HeapWord*            _partial_obj_addr;
     region_sz_t          _partial_obj_size;
     region_sz_t volatile _dc_and_los;
-    bool                 _blocks_filled;
+    bool        volatile _blocks_filled;
 
 #ifdef ASSERT
     size_t               _blocks_filled_count;   // Number of block table fills.
@@ -498,7 +498,9 @@
 inline bool
 ParallelCompactData::RegionData::blocks_filled() const
 {
-  return _blocks_filled;
+  bool result = _blocks_filled;
+  OrderAccess::acquire();
+  return result;
 }
 
 #ifdef ASSERT
@@ -512,6 +514,7 @@
 inline void
 ParallelCompactData::RegionData::set_blocks_filled()
 {
+  OrderAccess::release();
   _blocks_filled = true;
   // Debug builds count the number of times the table was filled.
   DEBUG_ONLY(Atomic::inc_ptr(&_blocks_filled_count));