8203341: Add a safepoint-aware Semaphore

Stefan Karlsson stefan.karlsson at oracle.com
Thu May 17 07:46:30 UTC 2018


Hi all,

Please review this patch to add a safepoint-aware Semaphore (and 
refactor the semaphore usage in thread-local handshakes).

http://cr.openjdk.java.net/~stefank/8203341/webrev.01/
https://bugs.openjdk.java.net/browse/JDK-8203341

Both ZGC and the thread-local handshakes need to move the JavaThread to 
a blocked state before waiting on a Semaphore. I propose that we 
introduce a new SemaphoreSafepointAware wrapper around Semaphore.

There are two things to consider with this patch:

1) In ZGC, where this patch originates from, we set the JavaThread's 
osthread state with osthread->set_state(CONDVAR_WAIT) (using 
OSThreadWaitState). This means that we get the following printed when 
the threads are dumped: "waiting on condition ". I've kept this behavior 
for the SemaphoreSafepointAware class. This means that we now change the 
osthread state for JavaThreads blocking in 
HandshakeState::process_self_inner.

2) The thread-local handshakes uses trywait before entering wait:
    if (!_semaphore.trywait()) {
-    ThreadBlockInVM tbivm(thread);
      _semaphore.wait();
    }

At the time when SemaphoreSafepointAware was written, we didn't have 
trywait on all platforms, now we do. Maybe we should always do the 
trywait dance inside SemaphoreSafepointAware::wait() ?

inline void SemaphoreSafepointAware::wait() {
   if (Thread::current()->is_Java_thread()) {
     if (!_semaphore.trywait) {
       JavaThread* thread = JavaThread::current();

       // Prepare to block and allow safepoints while blocked
       ThreadBlockInVM tbivm(thread);
       OSThreadWaitState osts(thread->osthread(), false /* not in 
Object.wait() */);

       // Wait for value
      _semaphore.wait();
    }

Thanks,
StefanK


More information about the hotspot-dev mailing list