Thank you Markus. /R
On Oct 12, 2012, at 7:29 AM, Markus Grönlund wrote: > 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 >>