--- deliantra/server/lib/cf.pm 2011/05/04 07:41:14 1.570 +++ deliantra/server/lib/cf.pm 2011/08/13 20:20:30 1.575 @@ -133,7 +133,8 @@ our %CFG; our $UPTIME; $UPTIME ||= time; -our $RUNTIME; +our $RUNTIME = 0; +our $SERVER_TICK = 0; our $NOW; our (%PLAYER, %PLAYER_LOADING); # all users @@ -153,6 +154,9 @@ our $REATTACH_ON_RELOAD; # set to true to force object reattach on reload (slow) our $REALLY_UNLOOP; # never set to true, please :) +our $WAIT_FOR_TICK = new Coro::Signal; +our @WAIT_FOR_TICK_BEGIN; + binmode STDOUT; binmode STDERR; @@ -195,7 +199,22 @@ =item $cf::UPTIME -The timestamp of the server start (so not actually an uptime). +The timestamp of the server start (so not actually an "uptime"). + +=item $cf::SERVER_TICK + +An unsigned integer that starts at zero when the server is started and is +incremented on every tick. + +=item $cf::NOW + +The (real) time of the last (current) server tick - updated before and +after tick processing, so this is useful only as a rough "what time is it +now" estimate. + +=item $cf::TICK + +The interval between each server tick, in seconds. =item $cf::RUNTIME @@ -211,14 +230,6 @@ unique-items directory, player file directory, random maps directory and database environment. -=item $cf::NOW - -The time of the last (current) server tick. - -=item $cf::TICK - -The interval between server ticks, in seconds. - =item $cf::LOADAVG The current CPU load on the server (alpha-smoothed), as a value between 0 @@ -240,6 +251,18 @@ returns directly I the tick processing (and consequently, can only wake one thread per tick), while cf::wait_for_tick wakes up all waiters after tick processing. +Note that cf::Wait_for_tick will immediately return when the server is not +ticking, making it suitable for small pauses in threads that need to run +when the server is paused. If that is not applicable (i.e. you I +want to wait, use C<$cf::WAIT_FOR_TICK>). + +=item $cf::WAIT_FOR_TICK + +Note that C is probably the correct thing to use. This +variable contains a L that is broadcats after every server +tick. Calling C<< ->wait >> on it will suspend the caller until after the +next server tick. + =cut sub wait_for_tick(); @@ -547,8 +570,7 @@ if (@SLOT_QUEUE) { # we do not use wait_for_tick() as it returns immediately when tick is inactive - push @cf::WAIT_FOR_TICK, $signal; - $signal->wait; + $WAIT_FOR_TICK->wait; } else { $busy = 0; Coro::schedule; @@ -2247,33 +2269,6 @@ $self } -# find and load all maps in the 3x3 area around a map -sub load_neighbours { - my ($map) = @_; - - my @neigh; # diagonal neighbours - - for (0 .. 3) { - my $neigh = $map->tile_path ($_) - or next; - $neigh = find $neigh, $map - or next; - $neigh->load; - - # now find the diagonal neighbours - push @neigh, - [$neigh->tile_path (($_ + 3) % 4), $neigh], - [$neigh->tile_path (($_ + 1) % 4), $neigh]; - } - - for (grep defined $_->[0], @neigh) { - my ($path, $origin) = @$_; - my $neigh = find $path, $origin - or next; - $neigh->load; - } -} - sub find_sync { my ($path, $origin) = @_; @@ -2301,7 +2296,7 @@ my ($path, $origin, $load) = @_; $path = normalise $path, $origin; - + if (my $map = $cf::MAP{$path}) { return $map if !$load || $map->linkable; } @@ -2755,7 +2750,6 @@ if $x <= 0 && $y <= 0; $map->load; - $map->load_neighbours; return unless $self->contr->active; @@ -3736,8 +3730,7 @@ cf::object::thawer::errors_are_fatal 0; info "parse errors in files are no longer fatal from this point on.\n"; - my $free_main; $free_main = EV::idle sub { - undef $free_main; + AE::postpone { undef &main; # free gobs of memory :) }; @@ -3904,7 +3897,7 @@ trace "emergency_perl_save: flushing outstanding aio requests"; while (IO::AIO::nreqs || BDB::nreqs) { - Coro::EV::timer_once 0.01; # let the sync_job do it's thing + Coro::AnyEvent::sleep 0.01; # let the sync_job do it's thing } cf::write_runtime_sync; # external watchdog should not bark @@ -4095,19 +4088,14 @@ my $bug_warning = 0; -our @WAIT_FOR_TICK; -our @WAIT_FOR_TICK_BEGIN; - sub wait_for_tick() { - return Coro::cede if tick_inhibit || $Coro::current == $Coro::main; + return Coro::AnyEvent::poll if tick_inhibit || $Coro::current == $Coro::main; - my $signal = new Coro::Signal; - push @WAIT_FOR_TICK, $signal; - $signal->wait; + $WAIT_FOR_TICK->wait; } sub wait_for_tick_begin() { - return Coro::cede if tick_inhibit || $Coro::current == $Coro::main; + return Coro::AnyEvent::poll if tick_inhibit || $Coro::current == $Coro::main; my $signal = new Coro::Signal; push @WAIT_FOR_TICK_BEGIN, $signal; @@ -4121,7 +4109,7 @@ return; } - cf::server_tick; # one server iteration + cf::one_tick; # one server iteration #for(1..3e6){} AE::now_update; $NOW=AE::now; # generate load #d# @@ -4137,9 +4125,7 @@ if (my $sig = shift @WAIT_FOR_TICK_BEGIN) { $sig->send; } - while (my $sig = shift @WAIT_FOR_TICK) { - $sig->send; - } + $WAIT_FOR_TICK->broadcast; $LOAD = ($NOW - $TICK_START) / $TICK; $LOADAVG = $LOADAVG * 0.75 + $LOAD * 0.25; @@ -4158,7 +4144,7 @@ BDB::min_parallel 16; BDB::max_poll_reqs $TICK * 0.1; - $AnyEvent::BDB::WATCHER->priority (1); + #$AnyEvent::BDB::WATCHER->priority (1); unless ($DB_ENV) { $DB_ENV = BDB::db_env_create;