< prev index next >

src/share/vm/gc_implementation/shenandoah/shenandoahCodeRoots.hpp

Print this page
rev 10690 : [backport] Cleanup header files and forward declarations
rev 10715 : [backport] Cleanup up superfluous newlines
rev 10740 : [backport] Protect more internal code from false sharing
rev 10772 : [backport] Update copyrights

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2017, 2018, Red Hat, Inc. and/or its affiliates.
+ * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.
  *

@@ -19,28 +19,29 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  *
  */
 
-
 #ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHCODEROOTS_HPP
 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHCODEROOTS_HPP
 
 #include "code/codeCache.hpp"
+#include "gc_implementation/shenandoah/shenandoahSharedVariables.hpp"
 #include "memory/allocation.hpp"
 #include "memory/iterator.hpp"
-#include "gc_implementation/shenandoah/shenandoahSharedVariables.hpp"
 
 class ShenandoahHeap;
 class ShenandoahHeapRegion;
 class ShenandoahCodeRootsLock;
 
 class ShenandoahParallelCodeCacheIterator VALUE_OBJ_CLASS_SPEC {
   friend class CodeCache;
 private:
+  char _pad0[DEFAULT_CACHE_LINE_SIZE];
   volatile int  _claimed_idx;
   volatile bool _finished;
+  char _pad1[DEFAULT_CACHE_LINE_SIZE];
 public:
   ShenandoahParallelCodeCacheIterator();
   void parallel_blobs_do(CodeBlobClosure* f);
 };
 

@@ -76,11 +77,13 @@
   friend class ShenandoahCodeRoots;
 protected:
   ShenandoahHeap* _heap;
   ShenandoahParallelCodeCacheIterator _par_iterator;
   ShenandoahSharedFlag _seq_claimed;
+  char _pad0[DEFAULT_CACHE_LINE_SIZE];
   volatile jlong _claimed;
+  char _pad1[DEFAULT_CACHE_LINE_SIZE];
 protected:
   ShenandoahCodeRootsIterator();
   ~ShenandoahCodeRootsIterator();
 
   template<bool CSET_FILTER>

@@ -123,15 +126,21 @@
    * @return
    */
   static ShenandoahCsetCodeRootsIterator cset_iterator();
 
 private:
-  static volatile jint _recorded_nms_lock;
+  struct PaddedLock {
+    char _pad0[DEFAULT_CACHE_LINE_SIZE];
+    volatile int _lock;
+    char _pad1[DEFAULT_CACHE_LINE_SIZE];
+  };
+
+  static PaddedLock _recorded_nms_lock;
   static GrowableArray<ShenandoahNMethod*>* _recorded_nms;
 
   static void acquire_lock(bool write) {
-    volatile jint* loc = &_recorded_nms_lock;
+    volatile int* loc = &_recorded_nms_lock._lock;
     if (write) {
       while ((OrderAccess::load_acquire(loc) != 0) ||
              Atomic::cmpxchg(-1, loc, 0) != 0) {
         SpinPause();
       }

@@ -150,11 +159,11 @@
       }
     }
   }
 
   static void release_lock(bool write) {
-    volatile jint* loc = &ShenandoahCodeRoots::_recorded_nms_lock;
+    volatile int* loc = &ShenandoahCodeRoots::_recorded_nms_lock._lock;
     if (write) {
       OrderAccess::release_store_fence(loc, 0);
     } else {
       Atomic::dec(loc);
     }
< prev index next >