David,

thanks for your reply!
I've changed the code according to the suggestions, I've also changed the types 
in PeriodicTask from being a size_t to being a
jint (see updated webrev for details). 

To prevent the waiting for very long time (which could overflow, etc) when we 
don't have any active task, I added an extra if
so that if we are waiting while no tasks are available, we reset the 
time_before_wait and consider time_slept to be zero after sleeping.
That means the first task added will always sleep for the period requested.

Updated webrev:
http://cr.openjdk.java.net/~rbackman/7127792.1/

Thanks
/R

On Oct 9, 2012, at 9:46 AM, David Holmes wrote:

> 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
>> 

Reply via email to