--- deliantra/server/lib/cf.pm 2007/01/02 23:12:47 1.126 +++ deliantra/server/lib/cf.pm 2007/01/03 00:05:26 1.127 @@ -10,7 +10,7 @@ use Safe; use Safe::Hole; -use Coro 3.3; +use Coro 3.3 (); use Coro::Event; use Coro::Timer; use Coro::Signal; @@ -247,6 +247,22 @@ } } +=item cf::async { BLOCK } + +Like C, but runs the given BLOCK in an eval and only logs the +error instead of exiting the server in case of a problem. + +=cut + +sub async(&) { + my ($cb) = @_; + + Coro::async { + eval { $cb->() }; + warn $@ if $@; + } +} + =item cf::sync_job { BLOCK } The design of crossfire+ requires that the main coro ($Coro::main) is @@ -303,12 +319,7 @@ sub coro(&) { my $cb = shift; - my $coro; $coro = async { - eval { - $cb->(); - }; - warn $@ if $@; - }; + my $coro = &cf::async ($cb); $coro->on_destroy (sub { delete $EXT_CORO{$coro+0}; @@ -1540,7 +1551,7 @@ # should happen only on crashes if ($pl->ob->{_link_pos}) { $pl->ob->enter_link; - Coro::async { + cf::async { # we need this sleep as the login has a concurrent enter_exit running # and this sleep increases chances of the player not ending up in scorn Coro::Timer::sleep 1; @@ -1559,7 +1570,7 @@ $self->enter_link; - (Coro::async { + (cf::async { $path = new cf::path $path; my $map = cf::map::find_map $path->as_string; @@ -1631,9 +1642,8 @@ $self->enter_link; - (Coro::async { + (cf::async { unless (eval { - prepare_random_map $exit if $exit->slaying eq "/!"; @@ -1732,12 +1742,7 @@ sub cf::client::coro { my ($self, $cb) = @_; - my $coro; $coro = async { - eval { - $cb->(); - }; - warn $@ if $@; - }; + my $coro = &cf::async ($cb); $coro->on_destroy (sub { delete $self->{_coro}{$coro+0};