--- deliantra/server/ext/map-scheduler.ext 2007/07/28 14:32:21 1.40 +++ deliantra/server/ext/map-scheduler.ext 2007/10/11 00:34:31 1.45 @@ -6,12 +6,13 @@ #our $DEACTIVATE_TIMEOUT = 20; # number of seconds after which maps get deactivated to save cpu our $SWAP_TIMEOUT = $cf::CFG{swap_timeout} || 300; # number of seconds after which inactive maps get swapped out -our $SCHEDULE_INTERVAL = $cf::CFG{schedule_interval} || .8; # time the map scheduler sleeps between runs +our $SCHEDULE_INTERVAL = $cf::CFG{schedule_interval} || 2; # time the map scheduler sleeps between runs our $SAVE_TIMEOUT = $cf::CFG{save_timeout} || 30; # save maps every n seconds our $SWAP_LOAD1 = $cf::CFG{swap_load1} || .1; # start aggressively swapping at this load our $SWAP_LOAD2 = $cf::CFG{swap_load2} || .4; # swap as fast as possible at this load cf::async_ext { + $Coro::current->{desc} = "startup map scanner"; $Coro::current->prio (Coro::PRIO_MIN); # load the header of swapped-out maps. @@ -52,11 +53,19 @@ }; our $SCHEDULER = cf::async_ext { - my $timer = Coro::Event->timer (after => 1); + $Coro::current->{desc} = "map scheduler"; + $Coro::current->prio (Coro::PRIO_MAX); + my $timer = Coro::Event->timer (data => cf::WF_AUTOCANCEL); while () { - $timer->interval ($SCHEDULE_INTERVAL); - $timer->next unless $cf::LOADAVG > $SWAP_LOAD2; + if ($cf::LOADAVG > $SWAP_LOAD2) { + $timer->interval (0.05); + $timer->next; + cf::wait_for_tick; + } else { + $timer->interval ($SCHEDULE_INTERVAL); + $timer->next; + } # this weird form of iteration over values is used because # the hash changes underneath us frequently, and for @@ -78,7 +87,8 @@ if ($map->should_reset) { $map->reset; } elsif ($map->in_memory == cf::MAP_IN_MEMORY) { - my $max_idle = cf::clamp +(cf::lerp $cf::LOADAVG, $SWAP_LOAD1, $SWAP_LOAD2, $SWAP_TIMEOUT, 0), 0, $SWAP_TIMEOUT; + my $max_idle = cf::clamp +(cf::lerp $cf::LOADAVG, $SWAP_LOAD1, $SWAP_LOAD2, $SWAP_TIMEOUT, $cf::TICK * 1.5), + $cf::TICK * 1.5, $SWAP_TIMEOUT; if ($map->last_access + $max_idle <= $cf::RUNTIME && !$map->players) { $map->swap_out;