mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 07:14:30 +02:00
7021531: lock ordering problems after fix for 6354181
Reviewed-by: kvn, jrose
This commit is contained in:
parent
4b3ada699d
commit
8967db2c35
3 changed files with 30 additions and 0 deletions
|
@ -123,18 +123,36 @@ extern outputStream* gclog_or_tty; // stream for gc log if -Xloggc:<f>, or tty
|
|||
|
||||
// advisory locking for the shared tty stream:
|
||||
class ttyLocker: StackObj {
|
||||
friend class ttyUnlocker;
|
||||
private:
|
||||
intx _holder;
|
||||
|
||||
public:
|
||||
static intx hold_tty(); // returns a "holder" token
|
||||
static void release_tty(intx holder); // must witness same token
|
||||
static bool release_tty_if_locked(); // returns true if lock was released
|
||||
static void break_tty_lock_for_safepoint(intx holder);
|
||||
|
||||
ttyLocker() { _holder = hold_tty(); }
|
||||
~ttyLocker() { release_tty(_holder); }
|
||||
};
|
||||
|
||||
// Release the tty lock if it's held and reacquire it if it was
|
||||
// locked. Used to avoid lock ordering problems.
|
||||
class ttyUnlocker: StackObj {
|
||||
private:
|
||||
bool _was_locked;
|
||||
public:
|
||||
ttyUnlocker() {
|
||||
_was_locked = ttyLocker::release_tty_if_locked();
|
||||
}
|
||||
~ttyUnlocker() {
|
||||
if (_was_locked) {
|
||||
ttyLocker::hold_tty();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// for writing to strings; buffer will expand automatically
|
||||
class stringStream : public outputStream {
|
||||
protected:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue