ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/lib/cf.pm
(Generate patch)

Comparing deliantra/server/lib/cf.pm (file contents):
Revision 1.504 by root, Sat Jan 30 23:50:16 2010 UTC vs.
Revision 1.506 by root, Wed Feb 3 20:48:22 2010 UTC

1399 . "\n};\n1"; 1399 . "\n};\n1";
1400 1400
1401 $todo{$base} = \%ext; 1401 $todo{$base} = \%ext;
1402 } 1402 }
1403 1403
1404 my $pass = 0;
1404 my %done; 1405 my %done;
1405 while (%todo) { 1406 while (%todo) {
1406 my $progress; 1407 my $progress;
1407 1408
1409 ++$pass;
1410
1411 ext:
1408 while (my ($k, $v) = each %todo) { 1412 while (my ($k, $v) = each %todo) {
1409 for (split /,\s*/, $v->{meta}{depends}) { 1413 for (split /,\s*/, $v->{meta}{depends}) {
1410 goto skip 1414 next ext
1411 unless exists $done{$_}; 1415 unless exists $done{$_};
1412 } 1416 }
1413 1417
1414 warn "... loading '$k' into '$v->{pkg}'\n"; 1418 warn "... pass $pass, loading '$k' into '$v->{pkg}'\n";
1415 1419
1416 unless (eval $v->{source}) { 1420 my $active = eval $v->{source};
1421
1422 if (length $@) {
1417 my $msg = $@ ? "$v->{path}: $@\n" 1423 warn "$v->{path}: $@\n";
1418 : "$v->{base}: extension inactive.\n";
1419 1424
1420 if (exists $v->{meta}{mandatory}) {
1421 warn $msg;
1422 cf::cleanup "mandatory extension failed to load, exiting."; 1425 cf::cleanup "mandatory extension '$k' failed to load, exiting."
1423 } 1426 if exists $v->{meta}{mandatory};
1424 1427 } else {
1425 warn $msg; 1428 $done{$k} = delete $todo{$k};
1429 push @EXTS, $v->{pkg};
1430 $progress = 1;
1431
1432 warn "$v->{base}: extension inactive.\n"
1433 unless $active;
1426 } 1434 }
1427
1428 $done{$k} = delete $todo{$k};
1429 push @EXTS, $v->{pkg};
1430 $progress = 1;
1431 } 1435 }
1432 1436
1433 skip: 1437 unless ($progress) {
1434 die "cannot load " . (join ", ", keys %todo) . ": unable to resolve dependencies\n" 1438 warn "cannot load " . (join ", ", keys %todo) . ": unable to resolve dependencies\n";
1435 unless $progress; 1439
1440 while (my ($k, $v) = each %todo) {
1441 cf::cleanup "mandatory extension '$k' has unresolved dependencies, exiting."
1442 if exists $v->{meta}{mandatory};
1443 }
1444 }
1436 } 1445 }
1437 }; 1446 };
1438} 1447}
1439 1448
1440############################################################################# 1449#############################################################################
3564 }; 3573 };
3565 } 3574 }
3566} 3575}
3567 3576
3568sub write_runtime_sync { 3577sub write_runtime_sync {
3578 my $t0 = EV::time;
3579
3569 # first touch the runtime file to show we are still running: 3580 # first touch the runtime file to show we are still running:
3570 # the fsync below can take a very very long time. 3581 # the fsync below can take a very very long time.
3571 3582
3572 IO::AIO::aio_utime $RUNTIMEFILE, undef, undef; 3583 IO::AIO::aio_utime $RUNTIMEFILE, undef, undef;
3573 3584
3574 my $guard = cf::lock_acquire "write_runtime"; 3585 my $guard = cf::lock_acquire "write_runtime";
3575 3586
3576 my $fh = aio_open "$RUNTIMEFILE~", O_WRONLY | O_CREAT, 0644 3587 my $fh = aio_open "$RUNTIMEFILE~", O_WRONLY | O_CREAT | O_TRUNC, 0644
3577 or return; 3588 or return;
3578 3589
3579 my $value = $cf::RUNTIME + 90 + 10; 3590 my $value = $cf::RUNTIME + 90 + 10;
3580 # 10 is the runtime save interval, for a monotonic clock 3591 # 10 is the runtime save interval, for a monotonic clock
3581 # 60 allows for the watchdog to kill the server. 3592 # 60 allows for the watchdog to kill the server.
3594 or return; 3605 or return;
3595 3606
3596 aio_rename "$RUNTIMEFILE~", $RUNTIMEFILE 3607 aio_rename "$RUNTIMEFILE~", $RUNTIMEFILE
3597 and return; 3608 and return;
3598 3609
3599 warn "runtime file written.\n"; 3610 warn sprintf "runtime file written (%gs).\n", EV::time - $t0;
3600 3611
3601 1 3612 1
3602} 3613}
3603 3614
3604our $uuid_lock; 3615our $uuid_lock;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines