RFR: 8011882: Replace spin loops as back off when suspending

David Holmes david.holmes at oracle.com
Sun Apr 21 23:23:35 PDT 2013


Okay - seems ready to ship. :)

Thanks,
David

On 22/04/2013 3:20 PM, Rickard Bäckman wrote:
> David,
>
> you are right, the only users of this mechanism are the old flatprofiler (which from what I could figure runs from the WatcherThread) and our sampler mechanism.
> That one also runs from the WatcherThread. The point of the assert you are writing about is to make sure that we actually consumed any post that the suspended thread
> may have issued.
>
> Thanks
> /R
>
> On Apr 22, 2013, at 1:53 AM, David Holmes wrote:
>
>> Hi Rickard,
>>
>> On 20/04/2013 12:19 AM, Rickard Bäckman wrote:
>>> David,
>>>
>>> here is an updated webrev with the changes incorporated.
>>>
>>> http://cr.openjdk.java.net/~rbackman/8011882.1/
>>
>> The changes look reasonable.
>>
>> My only concern is the:
>>
>> assert(!sr_semaphore.trywait(), "semaphore has invalid state");
>>
>> I'm not completely clear on the higher-level protocols and usage of this API and what actions can be attempted concurrently. These asserts indicate a strict one thread at a time usage - is that right?
>>
>> The validation of all this comes in the testing of course.
>>
>> Thanks,
>> David
>>
>>> Thanks
>>> /R
>>>
>>> On Apr 16, 2013, at 9:44 AM, Rickard Bäckman wrote:
>>>
>>>> David,
>>>>
>>>> thanks for the input, I'll go back to the split versions and update the timing.
>>>>
>>>> /R
>>>>
>>>> On Apr 16, 2013, at 1:27 AM, David Holmes wrote:
>>>>
>>>>> PS. Also see the existing unpackTime and compute_abstime helper functions for dealing with pthread/POSIX absolute timed-waits. Better than using javaTimeMillis()
>>>>>
>>>>> David
>>>>>
>>>>> On 15/04/2013 10:50 PM, David Holmes wrote:
>>>>>> On 15/04/2013 10:07 PM, Rickard Bäckman wrote:
>>>>>>> David,
>>>>>>>
>>>>>>> this is what the suggested semaphore.cpp/semaphore.hpp. Is that what
>>>>>>> you are looking for?
>>>>>>
>>>>>> <sigh> I thought so till I saw it - far uglier and complicated than I
>>>>>> had hoped. Sadly the three separate versions wins for me.
>>>>>>
>>>>>> By the way you can't do this:
>>>>>>
>>>>>> 116 bool Semaphore::timedwait(unsigned int sec, int nsec) {
>>>>>> 117   struct timespec ts;
>>>>>> 118   jlong endtime = os::javaTimeNanos() + (sec * NANOSECS_PER_SEC) +
>>>>>> nsec;
>>>>>> 119   ts.tv_sec = endtime / NANOSECS_PER_SEC;
>>>>>> 120   ts.tv_nsec = endtime % NANOSECS_PER_SEC;
>>>>>>
>>>>>> javaTimeNanos is not wall-clock time, but the POSIX sem_timewait
>>>>>> requires an absolute time - you need to use javaTimeMillis(). Which also
>>>>>> means the wait will be affected by changes to wall-clock time.
>>>>>>
>>>>>> David
>>>>>> -----
>>>>>>
>>>>>>> Webrev: http://cr.openjdk.java.net/~rbackman/webrev/
>>>>>>>
>>>>>>> Thanks
>>>>>>> /R
>>>>>>>
>>>>>>> On Apr 15, 2013, at 8:59 AM, David Holmes wrote:
>>>>>>>
>>>>>>>> On 15/04/2013 4:55 PM, Rickard Bäckman wrote:
>>>>>>>>> David,
>>>>>>>>>
>>>>>>>>> any new thoughts?
>>>>>>>>
>>>>>>>> Not a new one but I think factoring into Semaphore.hpp/cpp and using
>>>>>>>> a few ifdefs is better than three versions of the Semaphore class.
>>>>>>>> The signal thread could use it also.
>>>>>>>>
>>>>>>>> David
>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>> /R
>>>>>>>>>
>>>>>>>>> On Apr 12, 2013, at 8:06 AM, Rickard Bäckman wrote:
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Apr 12, 2013, at 7:34 AM, David Holmes wrote:
>>>>>>>>>>
>>>>>>>>>>> On 12/04/2013 3:01 PM, Rickard Bäckman wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> On Apr 12, 2013, at 1:04 AM, David Holmes wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> On 11/04/2013 11:02 PM, Rickard Bäckman wrote:
>>>>>>>>>>>>>> On Apr 11, 2013, at 2:39 PM, David Holmes wrote:
>>>>>>>>>>>>>>> So what did you mean about pthread_semaphore (what is that
>>>>>>>>>>>>>>> anyway?) ??
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Never mind, pthread condition variables.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Ah I see.
>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I really, really, really don't like seeing three versions of
>>>>>>>>>>>>>>> this class :( Can't BSD and Linux at least share a POSIX
>>>>>>>>>>>>>>> version? (And I wonder if we can actually mix-n-match UI
>>>>>>>>>>>>>>> threads on Solaris with POSIX semaphores on Solaris?)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I don't like it either, our OS code isn't really helpful when
>>>>>>>>>>>>>> it comes do reusing things :) Not sure how I would layout
>>>>>>>>>>>>>> things to make them only available on BSD (Not Mac) and Linux.
>>>>>>>>>>>>>> I guess os_posix.hpp with lots of #ifdefs, but I'm not sure I"m
>>>>>>>>>>>>>> feeling that happy about that.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Why would the os_posix version need a lot of ifdefs?
>>>>>>>>>>>>
>>>>>>>>>>>> Well, I guess we would need:
>>>>>>>>>>>>
>>>>>>>>>>>> (in ifdef pseudo language)
>>>>>>>>>>>>
>>>>>>>>>>>> #ifdef (LINUX || (BSD && !APPLE))
>>>>>>>>>>>>>>>>>>>>>>>> #endif
>>>>>>>>>>>
>>>>>>>>>>> But if it isn't "posix" then we won't be building os_posix - right?
>>>>>>>>>>
>>>>>>>>>> Linux, Solaris, Bsd & Mac builds and include os_posix. They are all
>>>>>>>>>> "implementing posix" we are just not using the same semaphore
>>>>>>>>>> implementation on all of them.
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> The second interesting problem this will get us into is that
>>>>>>>>>>>> sem_t is not declared in this context. Where do we put the
>>>>>>>>>>>> #include <semaphore.h>? Impossible in os_posix.hpp since it is
>>>>>>>>>>>> included in the middle of a class definition. I could put it in
>>>>>>>>>>>> os.hpp in the #ifdef path that does the jvm_platform.h includes,
>>>>>>>>>>>> not sure if that is very pretty either.
>>>>>>>>>>>
>>>>>>>>>>> Semaphores are already used by the signal handler thread -
>>>>>>>>>>> semaphore.h is included in os_linux.cpp etc, so why would os_posix
>>>>>>>>>>> be any different ?
>>>>>>>>>>>
>>>>>>>>>>> But couldn't we just have a Semaphore.h/cpp with any needed ifdefs?
>>>>>>>>>>>
>>>>>>>>>>>>> Do we really have four versions:
>>>>>>>>>>>>> - linux (posix)
>>>>>>>>>>>>> - BSD (posix)
>>>>>>>>>>>>> - Solaris
>>>>>>>>>>>>> - Mac (different to BSD?)
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> 3:
>>>>>>>>>>>> 1) linux & bsd uses the sem_ interface
>>>>>>>>>>>> 2) solaris uses the sema_ interface
>>>>>>>>>>>> 3) mac uses the semaphore_ interface
>>>>>>>>>>>
>>>>>>>>>>> Okay but if mac is BSD why can't we use bsd ie posix interface
>>>>>>>>>>> instead of the mach semaphore_ ?
>>>>>>>>>>
>>>>>>>>>> Because apple decided not to implement sem_timedwait.
>>>>>>>>>> On Solaris we use sema_ because sem_ requires us to link with -lrt
>>>>>>>>>> which we currently don't (and I'm not really feeling like adding it)
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> BTW I like the idea of using the semaphore, we're just haggling on
>>>>>>>>>>> the details. ;-)
>>>>>>>>>>
>>>>>>>>>> I'm fine with that :)
>>>>>>>>>>
>>>>>>>>>> /R
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> David
>>>>>>>>>>>
>>>>>>>>>>>> /R
>>>>>>>>>>>>
>>>>>>>>>>>>> ??
>>>>>>>>>>>>>
>>>>>>>>>>>>> David
>>>>>>>>>>>>> -----
>>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>
>>>
>


More information about the serviceability-dev mailing list