I am ok with this change Rickard. Thanks also to David Holmes for his great feedback and help on this one.
/Markus Sent from my iPhone On 12 okt 2012, at 07:06, Rickard Bäckman <rickard.back...@oracle.com> wrote: > People, > > I need at least one more reviewer, thanks! > > /R > > On Oct 9, 2012, at 3:00 PM, Rickard Bäckman wrote: > >> David, >> >> thanks for your review! >> >> /R >> >> On Oct 9, 2012, at 2:01 PM, David Holmes wrote: >> >>> On 9/10/2012 9:42 PM, Rickard Bäckman wrote: >>>> David, >>>> see inline. >>>> >>>> On Oct 9, 2012, at 1:18 PM, David Holmes wrote: >>>> >>>>> On 9/10/2012 7:36 PM, Rickard Bäckman wrote: >>>>>> 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). >>>>> >>>>> But now the type changes have been pushed out to the task creators. Most >>>>> task creations pass an int already but BiasedLocking uses a size_t. Just >>>>> shows how messed up the typing was to begin with. >>>> >>>> Agreed. Two ways of solving it, 1) change the callers to use an int. 2) Do >>>> the cast in the constructor (should be safe since we check the possible >>>> interval). >>> >>> int -> size_t shouldn't cause a warning so callers currently passing int >>> are ok. So keeping it as size_t in constructor arg and casting to int >>> before storing internally seems okay. >>> >>>>> >>>>> Minor nit: should be an int rather than jint as these are not Java types. >>>> >>>> Will fix. >>>> >>>>> >>>>>> 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. >>>>> >>>>> Those semantics seem reasonable. >>>>> >>>>> The only thing that concerns me here is the affect of calling >>>>> real_time_tick(0). I can't quite tell what the profiling code does. >>>> >>>> I could avoid calling that if time_slept = 0 >>> >>> Ok. You could skip real_time_tick altogether on zero. >>> >>> I'm generally okay with the approach being taken here, but the changes are >>> disruptive enough that I can't see for sure that existing tasks will be >>> unaffected. I guess time will tell. And let's see what others might spot. >>> >>> Thanks, >>> David (signing off for the night) >>> >>>> Thanks >>>> /R >>>> >>>>> >>>>> David >>>>> ----- >>>>> >>>>>> 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 >