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.20 by root, Mon Jan 8 22:32:10 2007 UTC vs.
Revision 1.21 by root, Mon Jan 8 23:36:16 2007 UTC

338 on_addme => \&addme, 338 on_addme => \&addme,
339); 339);
340 340
341############################################################################# 341#############################################################################
342 342
343our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs 343our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs
344our $SAVE_TIMEOUT = 200; # save players every n seconds 344our $SAVE_TIMEOUT = 20; # save players every n seconds
345our $SAVE_INTERVAL = 1.1; # save at max. one player every $SAVE_INTERVAL 345our $SAVE_INTERVAL = 1.1; # save at max. one player every $SAVE_INTERVAL
346 346
347our $SCHEDULER = cf::async_ext { 347our $SCHEDULER = cf::async_ext {
348 while () { 348 while () {
349 Coro::Timer::sleep $SCHEDULE_INTERVAL; 349 Coro::Timer::sleep $SCHEDULE_INTERVAL;
350 350
359 $pl->valid or next; 359 $pl->valid or next;
360 360
361 eval { 361 eval {
362 if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) { 362 if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) {
363 $pl->save; 363 $pl->save;
364 Coro::Timer::sleep $SAVE_INTERVAL;
365 }
366 364
367 unless ($pl->active) { 365 unless ($pl->active) {
368 # check refcounts, this is tricky and needs to be adjusted to fit server internals 366 # check refcounts, this is tricky and needs to be adjusted to fit server internals
369 my $ob = $pl->ob; 367 my $ob = $pl->ob;
370 Scalar::Util::weaken $pl; 368 Scalar::Util::weaken $pl;
371 Scalar::Util::weaken $ob; 369 Scalar::Util::weaken $ob;
372 my $a_ = $pl->refcnt; 370 my $a_ = $pl->refcnt;
373 my $b_ = $ob->refcnt; 371 my $b_ = $ob->refcnt;
374 my $pl_ref = $pl->refcnt_cnt; 372 my $pl_ref = $pl->refcnt_cnt;
375 my $ob_ref = $ob->refcnt_cnt; 373 my $ob_ref = $ob->refcnt_cnt;
376 374
377 if ($pl_ref == 2 && $ob_ref == 1) {
378 warn "player-scheduler destroy ", $ob->name;#d#
379 #delete $cf::PLAYER{$ob->name};
380 ## pl_ref == one from object + one from cf::PLAYER 375 ## pl_ref == one from object + one from cf::PLAYER
381 ## ob_ref == one from simply being an object 376 ## ob_ref == one from simply being an object
377 if ($pl_ref == 2 && $ob_ref == 1) {
378 warn "player-scheduler destroy ", $ob->name;#d#
379
380 # remove from sight and get fresh "copies"
381 $pl = delete $cf::PLAYER{$ob->name};
382 $ob = $pl->ob;
383
382 #$ob->destroy; 384 $ob->destroy;
383 #$pl->destroy; 385 $pl->destroy;
384 } else { 386 } else {
385 warn "player-scheduler refcnt ", $ob->name, " $pl_ref,$a_ $ob_ref,$b_\n";#d# 387 warn "player-scheduler refcnt ", $ob->name, " $pl_ref,$a_ $ob_ref,$b_\n";#d#
388 }
386 } 389 }
390 Coro::Timer::sleep $SAVE_INTERVAL;
387 } 391 }
388 }; 392 };
389 warn $@ if $@; 393 warn $@ if $@;
390 Coro::cede; 394 Coro::cede;
391 }; 395 };

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines