RFR: 8145725: Remove the WorkAroundNPTLTimedWaitHang workaround

David Holmes david.holmes at oracle.com
Mon Feb 15 05:34:56 UTC 2016


Hi Thomas,

On 10/02/2016 7:32 PM, Thomas Stüfe wrote:
> Hi David,
>
> I took a look at this, this is a nice cleanup.
>
> One question, in Parker::unpark, you moved the comparison (s<1) outside
> the mutex lock scope. The pthread_cond_signal() call was already outside
> the scope.

I presume you were really flagging the complete expression here not the 
s<1 part specifically. As you may have seen checking _cur_index outside 
the mutex's protection was very broken :(

David
-----

> Would it make not sense to move the comparison and conditional
> pthread_cond_signal into the mutex scope?
>
> Kind Regards, Thomas
>
>
>
> On Wed, Feb 10, 2016 at 5:41 AM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
>     Thanks Dmitry!
>
>     Can I have a second Reviewer please.
>
>     David
>
>
>     On 9/02/2016 6:06 PM, Dmitry Dmitriev wrote:
>
>         Hello David,
>
>         Looks good to me!
>
>         Thanks,
>         Dmitry
>
>         On 09.02.2016 4:17, David Holmes wrote:
>
>             Hi Dmitry,
>
>             Great cleanup suggestions. I also did some missing assert ->
>             assert_status conversions for the pthread_* functions. (And
>             reverted a
>             change that shouldn't have been made - assert_status is for
>             when the
>             "status" is the error code.)
>
>             New webrev:
>             http://cr.openjdk.java.net/~dholmes/8145725/webrev.v2/
>
>             Thanks,
>             David
>             -----
>
>             On 8/02/2016 11:24 PM, Dmitry Dmitriev wrote:
>
>                 Hello David,
>
>                 Looks good to me. Just few additional clean-ups which
>                 you can consider
>                 for implementing.
>                 1) hotspot/src/os/bsd/vm/os_bsd.cpp module
>
>                 I think that you can remove duplicated logic for mutex
>                 unlock from
>                 Parker::unpark function.
>
>                 I.e. transform it from:
>                 4376 void Parker::unpark() {
>                 ...
>                 4381   if (s < 1) {
>                 4382     status = pthread_mutex_unlock(_mutex);
>                 4383     assert_status(status == 0, status, "invariant");
>                 4384     status = pthread_cond_signal(_cond);
>                 4385     assert_status(status == 0, status, "invariant");
>                 4386   } else {
>                 4387     pthread_mutex_unlock(_mutex);
>                 4388     assert_status(status == 0, status, "invariant");
>                 4389   }
>                 4390 }
>
>                 To something like that:
>                 void Parker::unpark() {
>                 ...
>                     status = pthread_mutex_unlock(_mutex);
>                     assert_status(status == 0, status, "invariant");
>                     if (s < 1) {
>                       status = pthread_cond_signal(_cond);
>                       assert_status(status == 0, status, "invariant");
>                     }
>                    }
>
>                 2) hotspot/src/os/linux/vm/os_linux.cpp
>
>                 Similar refactoring for Parker::unpark for removing
>                 duplicated logic for
>                 mutex unlock.
>
>                 From:
>                 5720 void Parker::unpark() {
>                 ...
>                 5725   if (s < 1) {
>                 5726     // thread might be parked
>                 5727     if (_cur_index != -1) {
>                 5728       // thread is definitely parked
>                 5729       // must capture correct index before unlocking
>                 5730       int index = _cur_index;
>                 5731       status = pthread_mutex_unlock(_mutex);
>                 5732       assert(status == 0, "invariant");
>                 5733       status = pthread_cond_signal(&_cond[index]);
>                 5734       assert(status == 0, "invariant");
>                 5735     } else {
>                 5736       pthread_mutex_unlock(_mutex);
>                 5737       assert(status == 0, "invariant");
>                 5738     }
>                 5739   } else {
>                 5740     pthread_mutex_unlock(_mutex);
>                 5741     assert(status == 0, "invariant");
>                 5742   }
>                 5743 }
>
>                 To:
>
>                 void Parker::unpark() {
>                 ...
>                     if ((s < 1) && (_cur_index != -1)) {
>                         // thread is definitely parked
>                         // must capture correct index before unlocking
>                         int index = _cur_index;
>                         status = pthread_mutex_unlock(_mutex);
>                         assert(status == 0, "invariant");
>                         status = pthread_cond_signal(&_cond[index]);
>                         assert(status == 0, "invariant");
>                      } else {
>                        pthread_mutex_unlock(_mutex);
>                        assert(status == 0, "invariant");
>                      }
>                 }
>
>
>                 Thanks,
>                 Dmitry
>
>                 On 08.02.2016 10:16, David Holmes wrote:
>
>                     webrev:
>                     http://cr.openjdk.java.net/~dholmes/8145725/webrev/
>
>                     bug: https://bugs.openjdk.java.net/browse/JDK-8145725
>
>                     In JDK-8130728 we disabled the workaround by default
>                     and have not seen
>                     any issues (other than JDK-8029453). So now the
>                     workaround can be
>                     removed completely.
>
>                     Thanks,
>                     David
>
>
>
>


More information about the hotspot-runtime-dev mailing list