On Mon, 19 Apr 2021 07:13:57 GMT, Robbin Ehn <[email protected]> wrote:

>> src/hotspot/share/runtime/handshake.hpp line 133:
>> 
>>> 131:     // check the _lock, if held go to slow path.
>>> 132:     // Since the handshakee is unsafe if _lock gets locked after this 
>>> check
>>> 133:     // we know another thread cannot process any handshakes.
>> 
>> I can't quite understand this comment. I'm not sure what thread is calling 
>> this method and when, in relation to what the handshakee may be doing.
>
> The handshakee is in a safe state, e.g. blocked and does:
> Point A: set_thread_state_fence(_thread_blocked_trans);
> ...
> Point B: _lock.is_locked()
> 
> While the processor thread does:
> Point X: _lock.try_lock();
> ...
> Point Z: thread->thread_state();
> 
> If point B is passed with a non-locked lock, point Z is guaranteed to see an 
> unsafe thread and will not start to process ay handshakes.
> 
> Is that make sense, maybe the comment make more sense ? :)

The comment makes more sense now :)

>> src/hotspot/share/runtime/handshake.hpp line 157:
>> 
>>> 155:   Thread* active_handshaker() const { return _active_handshaker; }
>>> 156: 
>>> 157:   // Suspend/resume support
>> 
>> Taking a step back I can't help but think that this is entirely the wrong 
>> place to have the suspend/resume API and supporting code. It is only here 
>> because we re-use the HandshakeState _lock monitor right? If we introduced a 
>> new thread-suspension monitor instead then this code would all reside 
>> somewhere else - probably in the JavaThread class.
>
> When going to blocked inside the async handshake we **must** unlock the 
> HandshakeState lock.
> Thus _lock.wait() unlocks and gives us something to notify.
> We could do:
> 
> _lock.unlock();
> {
>   MutexLocker(SomeOtherLock) ml;
>   SomeOtherLock.wait();
> }
> _lock.lock();
> 
> 
> Another alternative is to create a friend class which uses the HandshakeState 
> lock and having the API there instead.

Borrowing the HandshakeState lock does create an artificial coupling here. I'd 
prefer to see this API in a more natural place with friendship used to access 
the mechanism as needed. Future cleanup though.

-------------

PR: https://git.openjdk.java.net/jdk/pull/3191

Reply via email to