Thanks again Dan,

 

Added some comments, pls see below.

 

/Markus

 

 

From: Daniel D. Daugherty 
Sent: den 24 februari 2015 22:26
To: Markus Gronlund
Cc: Alexander Garthwaite; Rickard Bäckman; David Holmes; Coleen Phillimore; 
hotspot-runtime-...@openjdk.java.net; serviceability-dev@openjdk.java.net; 
Carsten Varming
Subject: Re: RFR(XS) for PeriodicTask_lock cleanup (8072439)

 

Markus,

Thanks for the review. Replies embedded below.
 

On 2/24/15 8:13 AM, Markus Gronlund wrote:

Hi Dan,

 

I have taken a look with your suggested patch – I think your suggestion looks 
very good.

 
Thanks.





I guess the original hang happened because the PeriodicTask_lock was attempted 
to be acquired by a JavaThread, but the PeriodicTask_lock was still held by 
someone else. Since the PeriodicTask_lock was taken with 
“Mutex::_no_safepoint_checks” it meant the JavaThread bypassed the callback for 
a potentially pending safepoint and instead called parked upon the 
PeriodicTask_lock straight away...

 
Not sure which "original hang" you are referencing. There's
lots of gory details about the hang I fixed in JDK-8047720.
 
[MG] I meant the JDK-8047720 hang – wouldn’t you say all hangs are a bit 
“original” ? :)




I think this lock should definitely be taken the way you have done in the patch.

 
Glad we're on the same page.
 




I also think the placement of OrderAccess::fence() might have been due to some 
of the constructs being racy, take this for instance:

 

void WatcherThread::start() {

  assert(PeriodicTask_lock->owned_by_self(), "PeriodicTask_lock required");

 

  if (watcher_thread() == NULL && _startable) { _startable is visible since its 
the same thread

    _should_terminate = false; <<----------------------------- this is set but 
will not be visible to the WatcherThread being launched (it’s  a 0 in the 
static initializer however, so it is still “safe”)

    // Create the single instance of WatcherThread

    new WatcherThread();

 

// above the constructor for WatcherThread will start the thread, and the 
WatcherThread::run() might check _should_terminate before the launching thread 
releases the PeriodicTask_lock. Not that it will be an issue here, since 
_should_terminate is set to 0 in its static initializer.

 
The _should_terminate field is volatile and this is a
"single writer" situation relative to the WatcherThread
being a "single reader". Even if _should_terminate was
initialized to 99 in the static initializer, this line:

      1322     _should_terminate = false;

should be visible to the newly created WatcherThread on
these lines:

      1324     new WatcherThread();
      :
(old) 1255   while (!_should_terminate) {



 

[MG] I’m sorry, i overlooked the volatility of the variable – thanks – and I 
liked your updated comment regarding it (below).

 




But thanks Dan for moving this _should_terminate lower in the loop, at least 
the WatcherThread will need now need a call to sleep() before reaching it (and 
sleep needs the PeriodicTask_lock)


This was one of Carsten's suggested changes which I
picked up for this work.



Good work Carsten!






But for the construct in WatcherThread::stop(), there is no need (any more?) 
for the OrderAccess::fence(), I think it can be safely removed.


Do you (or Rickard) know why it was there in the first
place? Even in the original code for JDK-7127792 we should
not have needed the fence()...



[MG] I honestly don’t remember – as you point out it does not make any real 
sense in this context, so I can mostly assume a non-intentional 
change/something left in from previous experiments / lax reviewing on my part – 
maybe Rickard remembers if there was a real need for this..





Can you also remove the comment in thread.hpp : 704 that says:

 

  volatile static bool _should_terminate; // updated without holding lock

 

As this is not the case any longer.


How about this instead:

  // volatile due to at least one lock-free read
  volatile static bool _should_terminate;



 

[MG] yep. Good.




Otherwise it looks good!

 
Thanks!





Thanks for fixing this


I messed it up with my fix for JDK-8047720 so should
clean that up... :-)

Dan





 

Cheers

Markus

 

 

 

 

 

 

 

From: Daniel D. Daugherty 
Sent: den 17 februari 2015 23:42
To: Carsten Varming
Cc: Alexander Garthwaite; Rickard Bäckman; David Holmes; Markus Grönlund; 
Coleen Phillimore; HYPERLINK 
"mailto:hotspot-runtime-...@openjdk.java.net"hotspot-runtime-...@openjdk.java.net;
 HYPERLINK 
"mailto:serviceability-dev@openjdk.java.net"serviceability-dev@openjdk.java.net
Subject: Re: RFR(XS) for PeriodicTask_lock cleanup (8072439)

 

On 2/17/15 3:22 PM, Carsten Varming wrote:




Dear Daniel, 

 

Looks good to me.


Thanks for the fast review.






The line: "OrderAccess::fence();  // ensure WatcherThread sees update in main 
loop" seems unnecessary as the lock acts as a memory barrier.


Yes, I keep looking at that line from the original work on
JDK-7127792 and wonder why it's there... I'll chase that down
with the original folks...

Dan






 

Carsten

 

On Tue, Feb 17, 2015 at 4:44 PM, Daniel D. Daugherty <HYPERLINK 
"mailto:daniel.daughe...@oracle.com"; \ndaniel.daughe...@oracle.com> wrote:

Greetings,

My fix for the following bug:

    JDK-8047720 Xprof hangs on Solaris

that was pushed to JDK9 last June needs to be cleaned up.

Thanks to Alex Garthwaite (HYPERLINK "mailto:agarthwa...@twitter.com"; 
\nagarthwa...@twitter.com) and Carsten
Varming (HYPERLINK "mailto:varm...@gmail.com"; \nvarm...@gmail.com) for 
reporting the mess that I made
in WatcherThread::stop() and for suggesting fixes.

This code review is for a general cleanup pass on PeriodicTask_lock
and some of the surrounding code. This is a targeted review in that
I would like to hear from three groups of people:

1) The author and reviewers for:

   JDK-7127792 Add the ability to change an existing PeriodicTask's
               execution interval

   Rickard, David H, and Markus G.

2) The reviewers for:

   JDK-8047720 Xprof hangs on Solaris

   Markus G and Coleen

3) Alex and Carsten


Here's the webrev URL:

HYPERLINK 
"http://cr.openjdk.java.net/%7Edcubed/8072439-webrev/0-for_jdk9_hs_rt/"; 
\nhttp://cr.openjdk.java.net/~dcubed/8072439-webrev/0-for_jdk9_hs_rt/

I've attached the original RFR for JDK-8047720 that explains
the original deadlock that was being fixed. Similar testing
will be done with this fix.

Dan

 

 

 

Reply via email to