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