… | |
… | |
256 | { |
256 | { |
257 | while (timercnt && timers [0]->at <= ev_now) |
257 | while (timercnt && timers [0]->at <= ev_now) |
258 | { |
258 | { |
259 | struct ev_timer *w = timers [0]; |
259 | struct ev_timer *w = timers [0]; |
260 | |
260 | |
261 | fprintf (stderr, "0 %f, %d c%d\n", w->at, w->active, timercnt);//D |
|
|
262 | /* first reschedule timer */ |
261 | /* first reschedule timer */ |
263 | if (w->repeat) |
262 | if (w->repeat) |
264 | { |
263 | { |
265 | fprintf (stderr, "a %f now %f repeat %f, %f\n", w->at, ev_now, w->repeat, w->repeat *1e30);//D |
|
|
266 | if (w->is_abs) |
264 | if (w->is_abs) |
267 | w->at += ceil ((ev_now - w->at) / w->repeat + 1.) * w->repeat; |
265 | w->at += ceil ((ev_now - w->at) / w->repeat + 1.) * w->repeat; |
268 | else |
266 | else |
269 | w->at = ev_now + w->repeat; |
267 | w->at = ev_now + w->repeat; |
270 | |
268 | |
271 | fprintf (stderr, "b %f\n", w->at);//D |
|
|
272 | |
|
|
273 | downheap (0); |
269 | downheap (0); |
274 | } |
270 | } |
275 | else |
271 | else |
276 | { |
|
|
277 | fprintf (stderr, "c %f, %d c%d\n", w->at, w->active, timercnt);//D |
|
|
278 | evtimer_stop (w); /* nonrepeating: stop timer */ |
272 | evtimer_stop (w); /* nonrepeating: stop timer */ |
279 | } |
|
|
280 | |
273 | |
281 | event ((struct ev_watcher *)w, EV_TIMEOUT); |
274 | event ((struct ev_watcher *)w, EV_TIMEOUT); |
282 | } |
275 | } |
283 | } |
276 | } |
284 | |
277 | |
… | |
… | |
306 | block = timers [0]->at - ev_now + method_fudge; |
299 | block = timers [0]->at - ev_now + method_fudge; |
307 | if (block < 0.) block = 0.; |
300 | if (block < 0.) block = 0.; |
308 | else if (block > MAX_BLOCKTIME) block = MAX_BLOCKTIME; |
301 | else if (block > MAX_BLOCKTIME) block = MAX_BLOCKTIME; |
309 | } |
302 | } |
310 | |
303 | |
311 | fprintf (stderr, "block %f\n", block);//D |
|
|
312 | method_poll (block); |
304 | method_poll (block); |
313 | |
305 | |
314 | /* put pending timers into pendign queue and reschedule them */ |
306 | /* put pending timers into pendign queue and reschedule them */ |
315 | timer_reify (); |
307 | timer_reify (); |
316 | |
308 | |
… | |
… | |
394 | evtimer_start (struct ev_timer *w) |
386 | evtimer_start (struct ev_timer *w) |
395 | { |
387 | { |
396 | if (ev_is_active (w)) |
388 | if (ev_is_active (w)) |
397 | return; |
389 | return; |
398 | |
390 | |
399 | fprintf (stderr, "t1 %f a %d\n", w->at, w->is_abs);//D |
|
|
400 | if (w->is_abs) |
391 | if (w->is_abs) |
401 | { |
392 | { |
402 | /* this formula differs from the one in timer_reify becuse we do not round up */ |
393 | /* this formula differs from the one in timer_reify becuse we do not round up */ |
403 | if (w->repeat) |
394 | if (w->repeat) |
404 | w->at += ceil ((ev_now - w->at) / w->repeat) * w->repeat; |
395 | w->at += ceil ((ev_now - w->at) / w->repeat) * w->repeat; |
405 | } |
396 | } |
406 | else |
397 | else |
407 | w->at += ev_now; |
398 | w->at += ev_now; |
408 | fprintf (stderr, "t2 %f a %d\n", w->at, w->is_abs);//D |
|
|
409 | |
399 | |
410 | ev_start ((struct ev_watcher *)w, ++timercnt); |
400 | ev_start ((struct ev_watcher *)w, ++timercnt); |
411 | array_needsize (timers, timermax, timercnt, ); |
401 | array_needsize (timers, timermax, timercnt, ); |
412 | timers [timercnt - 1] = w; |
402 | timers [timercnt - 1] = w; |
413 | upheap (timercnt - 1); |
403 | upheap (timercnt - 1); |
414 | } |
404 | } |
415 | |
405 | |
416 | void |
406 | void |
417 | evtimer_stop (struct ev_timer *w) |
407 | evtimer_stop (struct ev_timer *w) |
418 | { |
408 | { |
419 | fprintf (stderr, "-topping %d, %d\n", w->active, timercnt);//D |
|
|
420 | if (!ev_is_active (w)) |
409 | if (!ev_is_active (w)) |
421 | return; |
410 | return; |
422 | |
411 | |
423 | fprintf (stderr, "stopping %d, %d\n", w->active, timercnt);//D |
|
|
424 | if (w->active < timercnt) |
412 | if (w->active < timercnt--) |
425 | { |
413 | { |
426 | timers [w->active - 1] = timers [--timercnt]; |
414 | timers [w->active - 1] = timers [timercnt]; |
427 | downheap (w->active - 1); |
415 | downheap (w->active - 1); |
428 | } |
416 | } |
429 | |
417 | |
430 | ev_stop ((struct ev_watcher *)w); |
418 | ev_stop ((struct ev_watcher *)w); |
431 | } |
419 | } |