ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev.c
(Generate patch)

Comparing libev/ev.c (file contents):
Revision 1.76 by root, Wed Nov 7 18:47:26 2007 UTC vs.
Revision 1.77 by root, Thu Nov 8 00:44:17 2007 UTC

960 struct ev_periodic *w = periodics [0]; 960 struct ev_periodic *w = periodics [0];
961 961
962 assert (("inactive timer on periodic heap detected", ev_is_active (w))); 962 assert (("inactive timer on periodic heap detected", ev_is_active (w)));
963 963
964 /* first reschedule or stop timer */ 964 /* first reschedule or stop timer */
965 if (w->reschedule_cb)
966 {
967 ev_tstamp at = ((WT)w)->at = w->reschedule_cb (w, rt_now + 0.0001);
968
969 assert (("ev_periodic reschedule callback returned time in the past", ((WT)w)->at > rt_now));
970 downheap ((WT *)periodics, periodiccnt, 0);
971 }
965 if (w->interval) 972 else if (w->interval)
966 { 973 {
967 ((WT)w)->at += floor ((rt_now - ((WT)w)->at) / w->interval + 1.) * w->interval; 974 ((WT)w)->at += floor ((rt_now - ((WT)w)->at) / w->interval + 1.) * w->interval;
968 assert (("ev_periodic timeout in the past detected while processing timers, negative interval?", ((WT)w)->at > rt_now)); 975 assert (("ev_periodic timeout in the past detected while processing timers, negative interval?", ((WT)w)->at > rt_now));
969 downheap ((WT *)periodics, periodiccnt, 0); 976 downheap ((WT *)periodics, periodiccnt, 0);
970 } 977 }
983 /* adjust periodics after time jump */ 990 /* adjust periodics after time jump */
984 for (i = 0; i < periodiccnt; ++i) 991 for (i = 0; i < periodiccnt; ++i)
985 { 992 {
986 struct ev_periodic *w = periodics [i]; 993 struct ev_periodic *w = periodics [i];
987 994
995 if (w->reschedule_cb)
996 ((WT)w)->at = w->reschedule_cb (w, rt_now);
988 if (w->interval) 997 else if (w->interval)
989 {
990 ev_tstamp diff = ceil ((rt_now - ((WT)w)->at) / w->interval) * w->interval; 998 ((WT)w)->at += ceil ((rt_now - ((WT)w)->at) / w->interval) * w->interval;
991
992 if (fabs (diff) >= 1e-4)
993 {
994 ev_periodic_stop (EV_A_ w);
995 ev_periodic_start (EV_A_ w);
996
997 i = 0; /* restart loop, inefficient, but time jumps should be rare */
998 }
999 }
1000 } 999 }
1000
1001 /* now rebuild the heap */
1002 for (i = periodiccnt >> 1; i--; )
1003 downheap ((WT *)periodics, periodiccnt, i);
1001} 1004}
1002 1005
1003inline int 1006inline int
1004time_update_monotonic (EV_P) 1007time_update_monotonic (EV_P)
1005{ 1008{
1309ev_periodic_start (EV_P_ struct ev_periodic *w) 1312ev_periodic_start (EV_P_ struct ev_periodic *w)
1310{ 1313{
1311 if (ev_is_active (w)) 1314 if (ev_is_active (w))
1312 return; 1315 return;
1313 1316
1317 if (w->reschedule_cb)
1318 ((WT)w)->at = w->reschedule_cb (w, rt_now);
1319 else if (w->interval)
1320 {
1314 assert (("ev_periodic_start called with negative interval value", w->interval >= 0.)); 1321 assert (("ev_periodic_start called with negative interval value", w->interval >= 0.));
1315
1316 /* this formula differs from the one in periodic_reify because we do not always round up */ 1322 /* this formula differs from the one in periodic_reify because we do not always round up */
1317 if (w->interval)
1318 ((WT)w)->at += ceil ((rt_now - ((WT)w)->at) / w->interval) * w->interval; 1323 ((WT)w)->at += ceil ((rt_now - ((WT)w)->at) / w->interval) * w->interval;
1324 }
1319 1325
1320 ev_start (EV_A_ (W)w, ++periodiccnt); 1326 ev_start (EV_A_ (W)w, ++periodiccnt);
1321 array_needsize (struct ev_periodic *, periodics, periodicmax, periodiccnt, (void)); 1327 array_needsize (struct ev_periodic *, periodics, periodicmax, periodiccnt, (void));
1322 periodics [periodiccnt - 1] = w; 1328 periodics [periodiccnt - 1] = w;
1323 upheap ((WT *)periodics, periodiccnt - 1); 1329 upheap ((WT *)periodics, periodiccnt - 1);
1339 periodics [((W)w)->active - 1] = periodics [periodiccnt]; 1345 periodics [((W)w)->active - 1] = periodics [periodiccnt];
1340 downheap ((WT *)periodics, periodiccnt, ((W)w)->active - 1); 1346 downheap ((WT *)periodics, periodiccnt, ((W)w)->active - 1);
1341 } 1347 }
1342 1348
1343 ev_stop (EV_A_ (W)w); 1349 ev_stop (EV_A_ (W)w);
1350}
1351
1352void
1353ev_periodic_again (EV_P_ struct ev_periodic *w)
1354{
1355 ev_periodic_stop (EV_A_ w);
1356 ev_periodic_start (EV_A_ w);
1344} 1357}
1345 1358
1346void 1359void
1347ev_idle_start (EV_P_ struct ev_idle *w) 1360ev_idle_start (EV_P_ struct ev_idle *w)
1348{ 1361{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines