--- deliantra/server/lib/cf.pm 2007/02/13 20:01:04 1.213 +++ deliantra/server/lib/cf.pm 2007/02/14 00:40:05 1.214 @@ -51,7 +51,7 @@ our $TICK = MAX_TIME * 1e-6; our $TICK_WATCHER; our $AIO_POLL_WATCHER; -our $WRITE_RUNTIME_WATCHER; +our $NEXT_RUNTIME_WRITE; # when should the runtime file be written our $NEXT_TICK; our $NOW; our $USE_FSYNC = 1; # use fsync to write maps - default off @@ -275,9 +275,7 @@ my $guard = Coro::guard { $TICK_WATCHER->start; - $WRITE_RUNTIME_WATCHER->start; }; - $WRITE_RUNTIME_WATCHER->stop; $TICK_WATCHER->stop; $guard } @@ -2302,7 +2300,6 @@ load_extensions; $TICK_WATCHER->start; - $WRITE_RUNTIME_WATCHER->start; Event::loop; } @@ -2376,9 +2373,9 @@ warn "entering sync_job"; cf::sync_job { - cf::write_runtime; + cf::write_runtime; # external watchdog should not bark cf::emergency_save; - cf::write_runtime; + cf::write_runtime; # external watchdog should not bark warn "syncing database to disk"; BDB::db_env_txn_checkpoint $DB_ENV; @@ -2530,6 +2527,15 @@ $RUNTIME += $TICK; $NEXT_TICK += $TICK; + if ($NOW >= $NEXT_RUNTIME_WRITE) { + $NEXT_RUNTIME_WRITE = $NOW + 10; + Coro::async_pool { + write_runtime + or warn "ERROR: unable to write runtime file: $!"; + }; + } + + $WAIT_FOR_TICK->broadcast; $WAIT_FOR_TICK_ONE->send if $WAIT_FOR_TICK_ONE->awaited; @@ -2601,31 +2607,14 @@ IO::AIO::max_poll_time $TICK * 0.1; $AIO_POLL_WATCHER = Event->io ( reentrant => 0, + data => WF_AUTOCANCEL, fd => IO::AIO::poll_fileno, poll => 'r', prio => 6, - data => WF_AUTOCANCEL, cb => \&IO::AIO::poll_cb, ); } -$WRITE_RUNTIME_WATCHER = Event->timer ( - reentrant => 0, - data => WF_AUTOCANCEL, - parked => 1, - after => 1, - interval => 10, - prio => 6, # keep it lowest so it acts like a watchdog - cb => sub { - $TICK_WATCHER->is_active or cf::cleanup "mainloop frozen but runtime active", 1; - - Coro::async_pool { - write_runtime - or warn "ERROR: unable to write runtime file: $!"; - }; - }, -); - END { cf::emergency_save } 1