--- deliantra/server/lib/cf.pm 2007/04/27 19:53:05 1.260 +++ deliantra/server/lib/cf.pm 2007/05/05 05:40:27 1.263 @@ -373,6 +373,7 @@ my $runtime = "$LOCALDIR/runtime"; + warn "starting to write runtime...\n";#d# my $fh = aio_open "$runtime~", O_WRONLY | O_CREAT, 0644 or return; @@ -393,6 +394,8 @@ aio_rename "$runtime~", $runtime and return; + warn "... done writing runtime.\n";#d# + 1 } @@ -2437,9 +2440,10 @@ return wantarray ? @$res : $res->[-1]; } else { + reset_signals; local $SIG{__WARN__}; + local $SIG{__DIE__}; eval { - local $SIG{__DIE__}; close $fh1; my @res = eval { $cb->(@args) }; @@ -2925,31 +2929,42 @@ ); } +my $_log_backtrace; + sub _log_backtrace { my ($msg, @addr) = @_; - async { - my @bt = fork_call { - @addr = map { sprintf "%x", $_ } @addr; - open my $fh, "exec addr2line -C -f -i -e \Q$^X\E @addr 2>&1 |" - or die "addr2line: $!"; - - my @funcs; - my @res = <$fh>; - chomp for @res; - while (@res) { - my ($func, $line) = splice @res, 0, 2, (); - push @funcs, "[$func] $line"; - } + $msg =~ s/\n//; - @funcs - }; + # limit the # of concurrent backtraces + if ($_log_backtrace < 2) { + ++$_log_backtrace; + async { + my @bt = fork_call { + @addr = map { sprintf "%x", $_ } @addr; + my $self = (-f "/proc/$$/exe") ? "/proc/$$/exe" : $^X; + open my $fh, "exec addr2line -C -f -i -e \Q$self\E @addr 2>&1 |" + or die "addr2line: $!"; + + my @funcs; + my @res = <$fh>; + chomp for @res; + while (@res) { + my ($func, $line) = splice @res, 0, 2, (); + push @funcs, "[$func] $line"; + } - $msg =~ s/\n//; + @funcs + }; + LOG llevInfo, "[ABT] $msg\n"; + LOG llevInfo, "[ABT] $_\n" for @bt; + --$_log_backtrace; + }; + } else { LOG llevInfo, "[ABT] $msg\n"; - LOG llevInfo, "[ABT] $_\n" for @bt; - }; + LOG llevInfo, "[ABT] [suppressed]\n"; + } } # load additional modules