RFR S: 7127792 Add the ability to change an existing PeriodicTask's execution interval
David Holmes
david.holmes at oracle.com
Tue Oct 9 00:46:41 PDT 2012
Sorry Rickard, missed the original RFR :)
So to be clear here the synopsis concerns changing the period, while the
mechanism implemented is for a more general dynamic disenroll / enroll.
So changing a period is effected by removing a task and then adding it
with the new period.
And for anyone not reading the fine-print when you dynamically enroll a
task its first firing is somewhat arbitrary - somewhere between the time
of enrollment and that time plus its period.
src/share/vm/runtime/thread.hpp
Can you add a comment:
static void stop();
+ // Only allow start once the VM is sufficiently initialized
+ // Otherwise the first task to enroll will trigger the start
+ static void make_startable();
---
src/share/vm/runtime/thread.cpp
We have a bit of type mixing here:
- size_t time_to_wait
- jlong time_slept
- int remaining = time_to_wait
I don't understand why Task is using size_t for time intervals. If you
make "remaining" a size_t then it will cause issues when you pass it to
wait. But I would expect the initialization of "remaining" to cause an
unsigned-to-signed conversion warning, so perhaps an explicit cast to
silence that.
1203 bool status =
PeriodicTask_lock->wait(Mutex::_no_safepoint_check_flag, remaining);
1204 if (status || _should_terminate) {
1205 break;
1206 }
Can you rename status to timedout to make the logic more obvious. Also
note that you will potentially return with time_slept still at zero,
even though you may have slept for an arbitrary amount of time. That
seems wrong as zero will then be passed to "tick".
1208 // spurious wakeup of some kind
This comment is no longer accurate as you may have been woken up due to
a change in the task list, I suggest:
// Change to task list or spurious wakeup of some kind
1213 remaining = PeriodicTask::time_to_wait();
1214 if (remaining == 0) {
1215 continue;
1216 }
Can you insert a comment before continue:
// Last task was just disenrolled so loop around and wait until
// another task gets enrolled
continue;
1218 remaining -= time_slept;
Again type mixing: subtracting a long from an int. Again a potential
warning to get rid of.
Also in a long running VM perhaps there have been no periodic tasks for
many days and then one turns up. The subtraction could wrap and cause
remaining to remain positive. I know you've now documented the
uncertainty in the first fire time but this seems somewhat too random.
Let's see what others think. :)
1329 PeriodicTask_lock->notify_all();
There is only one thread that waits so notify() will suffice.
Thanks,
David
On 9/10/2012 4:34 PM, Rickard Bäckman wrote:
> Trying again,
>
> can I have a couple of reviews, please?
>
> /R
>
> On Oct 4, 2012, at 3:01 PM, Rickard Bäckman wrote:
>
>> Hi all,
>>
>> can I please have a couple of reviews on the following change:
>>
>> http://cr.openjdk.java.net/~rbackman/7127792/
>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7127792
>>
>> In short the purpose is to enable tasks to change the interval they are executed in. We
>> would also like to be able to add (and remove) tasks after the WatcherThread has started.
>>
>> Thanks
>> /R
>
More information about the hotspot-runtime-dev
mailing list