… | |
… | |
44 | our @EVENT; |
44 | our @EVENT; |
45 | our $LIBDIR = datadir . "/ext"; |
45 | our $LIBDIR = datadir . "/ext"; |
46 | |
46 | |
47 | our $TICK = MAX_TIME * 1e-6; |
47 | our $TICK = MAX_TIME * 1e-6; |
48 | our $TICK_WATCHER; |
48 | our $TICK_WATCHER; |
|
|
49 | our $AIO_POLL_WATCHER; |
|
|
50 | our $WRITE_RUNTIME_WATCHER; |
49 | our $NEXT_TICK; |
51 | our $NEXT_TICK; |
50 | our $NOW; |
52 | our $NOW; |
51 | |
53 | |
52 | our %CFG; |
54 | our %CFG; |
53 | |
55 | |
… | |
… | |
257 | } |
259 | } |
258 | |
260 | |
259 | sub freeze_mainloop { |
261 | sub freeze_mainloop { |
260 | return unless $TICK_WATCHER->is_active; |
262 | return unless $TICK_WATCHER->is_active; |
261 | |
263 | |
262 | my $guard = Coro::guard { $TICK_WATCHER->start }; |
264 | my $guard = Coro::guard { |
|
|
265 | $TICK_WATCHER->start; |
|
|
266 | $WRITE_RUNTIME_WATCHER->start; |
|
|
267 | }; |
|
|
268 | $WRITE_RUNTIME_WATCHER->stop; |
263 | $TICK_WATCHER->stop; |
269 | $TICK_WATCHER->stop; |
264 | $guard |
270 | $guard |
265 | } |
271 | } |
266 | |
272 | |
267 | =item cf::async { BLOCK } |
273 | =item cf::async { BLOCK } |
… | |
… | |
338 | |
344 | |
339 | $coro |
345 | $coro |
340 | } |
346 | } |
341 | |
347 | |
342 | sub write_runtime { |
348 | sub write_runtime { |
343 | return unless $TICK_WATCHER->is_active; |
|
|
344 | |
|
|
345 | my $runtime = cf::localdir . "/runtime"; |
349 | my $runtime = cf::localdir . "/runtime"; |
346 | |
350 | |
347 | my $fh = aio_open "$runtime~", O_WRONLY | O_CREAT, 0644 |
351 | my $fh = aio_open "$runtime~", O_WRONLY | O_CREAT, 0644 |
348 | or return; |
352 | or return; |
349 | |
353 | |
… | |
… | |
2402 | }, |
2406 | }, |
2403 | ); |
2407 | ); |
2404 | |
2408 | |
2405 | IO::AIO::max_poll_time $TICK * 0.2; |
2409 | IO::AIO::max_poll_time $TICK * 0.2; |
2406 | |
2410 | |
2407 | Event->io ( |
2411 | $AIO_POLL_WATCHER = Event->io ( |
2408 | fd => IO::AIO::poll_fileno, |
2412 | fd => IO::AIO::poll_fileno, |
2409 | poll => 'r', |
2413 | poll => 'r', |
2410 | prio => 5, |
2414 | prio => 5, |
2411 | data => WF_AUTOCANCEL, |
2415 | data => WF_AUTOCANCEL, |
2412 | cb => \&IO::AIO::poll_cb, |
2416 | cb => \&IO::AIO::poll_cb, |
2413 | ); |
2417 | ); |
2414 | |
2418 | |
2415 | Event->timer ( |
2419 | $WRITE_RUNTIME_WATCHER = Event->timer ( |
2416 | data => WF_AUTOCANCEL, |
2420 | data => WF_AUTOCANCEL, |
2417 | after => 0, |
2421 | after => 0, |
2418 | interval => 10, |
2422 | interval => 10, |
2419 | cb => sub { |
2423 | cb => sub { |
2420 | (Coro::unblock_sub { |
2424 | (Coro::unblock_sub { |