src/hotspot/share/gc/shenandoah/shenandoahLock.hpp
author zgu
Wed, 27 Nov 2019 11:52:57 -0500
changeset 59296 9186be5c78ba
parent 58675 0cc52a55fce4
permissions -rw-r--r--
8228720: Shenandoah: Implementation of concurrent class unloading Reviewed-by: rkennke
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     1
/*
55083
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
     2
 * Copyright (c) 2017, 2019, Red Hat, Inc. All rights reserved.
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     3
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     4
 * This code is free software; you can redistribute it and/or modify it
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     5
 * under the terms of the GNU General Public License version 2 only, as
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     6
 * published by the Free Software Foundation.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     7
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     8
 * This code is distributed in the hope that it will be useful, but WITHOUT
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
     9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    10
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    11
 * version 2 for more details (a copy is included in the LICENSE file that
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    12
 * accompanied this code).
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    13
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License version
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    15
 * 2 along with this work; if not, write to the Free Software Foundation,
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    16
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    17
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    18
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    19
 * or visit www.oracle.com if you need additional information or have any
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    20
 * questions.
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    21
 *
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    22
 */
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    23
55083
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    24
#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    25
#define SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    26
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    27
#include "memory/allocation.hpp"
59296
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
    28
#include "runtime/safepoint.hpp"
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    29
#include "runtime/thread.hpp"
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    30
55083
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    31
class ShenandoahLock  {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    32
private:
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    33
  enum LockState { unlocked = 0, locked = 1 };
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    34
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    35
  DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile int));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    36
  volatile int _state;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    37
  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile Thread*));
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    38
  volatile Thread* _owner;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    39
  DEFINE_PAD_MINUS_SIZE(2, DEFAULT_CACHE_LINE_SIZE, 0);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    40
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    41
public:
55083
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    42
  ShenandoahLock() : _state(unlocked), _owner(NULL) {};
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    43
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    44
  void lock() {
58675
0cc52a55fce4 8232534: Shenandoah: guard against reentrant ShenandoahHeapLock locking
shade
parents: 55083
diff changeset
    45
#ifdef ASSERT
0cc52a55fce4 8232534: Shenandoah: guard against reentrant ShenandoahHeapLock locking
shade
parents: 55083
diff changeset
    46
    assert(_owner != Thread::current(), "reentrant locking attempt, would deadlock");
0cc52a55fce4 8232534: Shenandoah: guard against reentrant ShenandoahHeapLock locking
shade
parents: 55083
diff changeset
    47
#endif
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    48
    Thread::SpinAcquire(&_state, "Shenandoah Heap Lock");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    49
#ifdef ASSERT
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    50
    assert(_state == locked, "must be locked");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    51
    assert(_owner == NULL, "must not be owned");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    52
    _owner = Thread::current();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    53
#endif
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    54
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    55
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    56
  void unlock() {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    57
#ifdef ASSERT
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    58
    assert (_owner == Thread::current(), "sanity");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    59
    _owner = NULL;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    60
#endif
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    61
    Thread::SpinRelease(&_state);
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    62
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    63
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    64
#ifdef ASSERT
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    65
  void assert_owned_by_current_thread() {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    66
    assert(_state == locked, "must be locked");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    67
    assert(_owner == Thread::current(), "must be owned by current thread");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    68
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    69
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    70
  void assert_not_owned_by_current_thread() {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    71
    assert(_owner != Thread::current(), "must be not owned by current thread");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    72
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    73
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    74
  void assert_owned_by_current_thread_or_safepoint() {
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    75
    Thread* thr = Thread::current();
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    76
    assert((_state == locked && _owner == thr) ||
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    77
           (SafepointSynchronize::is_at_safepoint() && thr->is_VM_thread()),
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    78
           "must own heap lock or by VM thread at safepoint");
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    79
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    80
#endif
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    81
};
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    82
55083
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    83
class ShenandoahLocker : public StackObj {
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    84
private:
55083
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    85
  ShenandoahLock* const _lock;
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    86
public:
55083
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    87
  ShenandoahLocker(ShenandoahLock* lock) : _lock(lock) {
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    88
    if (_lock != NULL) {
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    89
      _lock->lock();
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    90
    }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    91
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    92
55083
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    93
  ~ShenandoahLocker() {
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    94
    if (_lock != NULL) {
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    95
      _lock->unlock();
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
    96
    }
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    97
  }
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    98
};
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents:
diff changeset
    99
59296
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   100
class ShenandoahSimpleLock {
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   101
private:
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   102
  os::PlatformMonitor   _lock; // native lock
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   103
public:
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   104
  ShenandoahSimpleLock();
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   105
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   106
  virtual void lock();
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   107
  virtual void unlock();
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   108
};
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   109
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   110
class ShenandoahReentrantLock : public ShenandoahSimpleLock {
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   111
private:
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   112
  Thread* volatile      _owner;
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   113
  uint64_t              _count;
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   114
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   115
public:
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   116
  ShenandoahReentrantLock();
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   117
  ~ShenandoahReentrantLock();
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   118
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   119
  virtual void lock();
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   120
  virtual void unlock();
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   121
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   122
  // If the lock already owned by this thread
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   123
  bool owned_by_self() const ;
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   124
};
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   125
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   126
class ShenandoahReentrantLocker : public StackObj {
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   127
private:
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   128
  ShenandoahReentrantLock* const _lock;
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   129
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   130
public:
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   131
  ShenandoahReentrantLocker(ShenandoahReentrantLock* lock) :
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   132
    _lock(lock) {
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   133
    if (_lock != NULL) {
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   134
      _lock->lock();
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   135
    }
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   136
  }
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   137
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   138
  ~ShenandoahReentrantLocker() {
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   139
    if (_lock != NULL) {
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   140
      assert(_lock->owned_by_self(), "Must be owner");
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   141
      _lock->unlock();
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   142
    }
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   143
  }
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   144
};
9186be5c78ba 8228720: Shenandoah: Implementation of concurrent class unloading
zgu
parents: 58675
diff changeset
   145
55083
2fc6027f0eed 8224932: Shenandoah: Rename ShenandoahHeapLock, make it general purpose lock
zgu
parents: 53244
diff changeset
   146
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHLOCK_HPP