--- deliantra/server/ext/map-scheduler.ext 2007/10/01 00:55:51 1.44 +++ deliantra/server/ext/map-scheduler.ext 2008/04/15 14:21:04 1.47 @@ -6,10 +6,10 @@ #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} || 5; # 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 +our $SWAP_LOAD2 = $cf::CFG{swap_load2} || .6; # swap as fast as possible at this load cf::async_ext { $Coro::current->{desc} = "startup map scanner"; @@ -55,11 +55,13 @@ our $SCHEDULER = cf::async_ext { $Coro::current->{desc} = "map scheduler"; $Coro::current->prio (Coro::PRIO_MAX); - my $timer = Coro::Event->timer (after => 1, data => cf::WF_AUTOCANCEL); while () { - $timer->interval ($SCHEDULE_INTERVAL); - $timer->next unless $cf::LOADAVG > $SWAP_LOAD2; + if ($cf::LOADAVG > $SWAP_LOAD2) { + cf::wait_for_tick; + } else { + Coro::EV::timer_once $SCHEDULE_INTERVAL; + } # this weird form of iteration over values is used because # the hash changes underneath us frequently, and for @@ -80,7 +82,7 @@ # } if ($map->should_reset) { $map->reset; - } elsif ($map->in_memory == cf::MAP_IN_MEMORY) { + } elsif ($map->in_memory == cf::MAP_ACTIVE) { 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;