ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/login.ext
(Generate patch)

Comparing deliantra/server/ext/login.ext (file contents):
Revision 1.16 by root, Mon Jan 8 12:39:16 2007 UTC vs.
Revision 1.17 by root, Mon Jan 8 14:11:05 2007 UTC

341); 341);
342 342
343############################################################################# 343#############################################################################
344 344
345our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs 345our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs
346our $SWAP_TIMEOUT = 30; # time after which an unused player is evicted form memory
347our $SAVE_TIMEOUT = 20; # save players every n seconds 346our $SAVE_TIMEOUT = 200; # save players every n seconds
348our $SAVE_INTERVAL = 0.1; # save at max. one player every $SAVE_INTERVAL 347our $SAVE_INTERVAL = 0.1; # save at max. one player every $SAVE_INTERVAL
349 348
350our $SCHEDULER = cf::async_ext { 349our $SCHEDULER = cf::async_ext {
351 while () { 350 while () {
352 Coro::Timer::sleep $SCHEDULE_INTERVAL; 351 Coro::Timer::sleep $SCHEDULE_INTERVAL;
364 eval { 363 eval {
365 if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) { 364 if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) {
366 $pl->save; 365 $pl->save;
367 Coro::Timer::sleep $SAVE_INTERVAL; 366 Coro::Timer::sleep $SAVE_INTERVAL;
368 } 367 }
368
369 unless ($pl->active) {
370 # check refcounts, this is tricky and needs to be adjusted to fit server internals
369 my $ob = $pl->ob; 371 my $ob = $pl->ob;
370 Scalar::Util::weaken $pl; # 2 == from object + from perl 372 Scalar::Util::weaken $pl;
371 Scalar::Util::weaken $ob; # 2 == one from being an object + ??? 373 Scalar::Util::weaken $ob;
372 my $a_ = $pl->refcnt; 374 my $a_ = $pl->refcnt;
373 my $b_ = $ob->refcnt; 375 my $b_ = $ob->refcnt;
374 my $a = $pl->refcnt_cnt; 376 my $pl_ref = $pl->refcnt_cnt;
375 my $b = $ob->refcnt_cnt; 377 my $ob_ref = $ob->refcnt_cnt;
376 warn "rc $a,$a_ $b,$b_\n";#d# 378
379 if ($pl_ref == 2 && $ob_ref == 1) {
380 warn "player-scheduler destroy ", $ob->name;#d#
381 delete $cf::PLAYER{$ob->name};
382 # pl_ref == one from object + one from cf::PLAYER
383 # ob_ref == one from simply being an object
384 $ob->destroy;
385 $pl->destroy;
386 } else {
387 warn "player-scheduler refcnt ", $ob->name, " $pl_ref,$a_ $ob_ref,$b_\n";#d#
388 }
389 }
377 }; 390 };
378 warn $@ if $@; 391 warn $@ if $@;
379 Coro::cede; 392 Coro::cede;
380 }; 393 };
381 } 394 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines