< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahSpinLock.hpp

Print this page
rev 55060 : 8224875: Shenandoah: ParallelCleaning code unloading should take lock to protect shared code roots array

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
+ * Copyright (c) 2017, 2019, 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,28 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  *
  */
 
-#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHHEAPLOCK_HPP
-#define SHARE_GC_SHENANDOAH_SHENANDOAHHEAPLOCK_HPP
+#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHSPINLOCK_HPP
+#define SHARE_GC_SHENANDOAH_SHENANDOAHSPINLOCK_HPP
 
 #include "memory/allocation.hpp"
 #include "runtime/thread.hpp"
 
-class ShenandoahHeapLock  {
+class ShenandoahSpinLock  {
 private:
   enum LockState { unlocked = 0, locked = 1 };
 
   DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile int));
   volatile int _state;
   DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile Thread*));
   volatile Thread* _owner;
   DEFINE_PAD_MINUS_SIZE(2, DEFAULT_CACHE_LINE_SIZE, 0);
 
 public:
-  ShenandoahHeapLock() : _state(unlocked), _owner(NULL) {};
+  ShenandoahSpinLock() : _state(unlocked), _owner(NULL) {};
 
   void lock() {
     Thread::SpinAcquire(&_state, "Shenandoah Heap Lock");
 #ifdef ASSERT
     assert(_state == locked, "must be locked");

@@ -74,20 +74,26 @@
            "must own heap lock or by VM thread at safepoint");
   }
 #endif
 };
 
-class ShenandoahHeapLocker : public StackObj {
+class ShenandoahSpinLocker : public StackObj {
 private:
-  ShenandoahHeapLock* _lock;
+  ShenandoahSpinLock* const _lock;
 public:
-  ShenandoahHeapLocker(ShenandoahHeapLock* lock) {
-    _lock = lock;
+  ShenandoahSpinLocker(ShenandoahSpinLock* lock) : _lock(lock) {
+    if (_lock != NULL) {
     _lock->lock();
   }
+  }
 
-  ~ShenandoahHeapLocker() {
+  ~ShenandoahSpinLocker() {
+    if (_lock != NULL) {
     _lock->unlock();
   }
+  }
 };
 
-#endif // SHARE_GC_SHENANDOAH_SHENANDOAHHEAPLOCK_HPP
+typedef ShenandoahSpinLock   ShenandoahHeapLock;
+typedef ShenandoahSpinLocker ShenandoahHeapLocker;
+
+#endif // SHARE_GC_SHENANDOAH_SHENANDOAHSPINLOCK_HPP
< prev index next >