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.503 by root, Sat Jan 30 23:46:39 2010 UTC vs.
Revision 1.508 by root, Sun Mar 28 22:29:50 2010 UTC

1# 1#
2# This file is part of Deliantra, the Roguelike Realtime MMORPG. 2# This file is part of Deliantra, the Roguelike Realtime MMORPG.
3# 3#
4# Copyright (©) 2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4# Copyright (©) 2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5# 5#
6# Deliantra is free software: you can redistribute it and/or modify it under 6# Deliantra is free software: you can redistribute it and/or modify it under
7# the terms of the Affero GNU General Public License as published by the 7# the terms of the Affero GNU General Public License as published by the
8# Free Software Foundation, either version 3 of the License, or (at your 8# Free Software Foundation, either version 3 of the License, or (at your
9# option) any later version. 9# option) any later version.
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#############################################################################
1760 my $lock = cf::lock_acquire "generate_random_map"; # the random map generator is NOT reentrant ATM 1769 my $lock = cf::lock_acquire "generate_random_map"; # the random map generator is NOT reentrant ATM
1761 1770
1762 # mit "rum" bekleckern, nicht 1771 # mit "rum" bekleckern, nicht
1763 $self->_create_random_map ( 1772 $self->_create_random_map (
1764 $rmp->{wallstyle}, $rmp->{wall_name}, $rmp->{floorstyle}, $rmp->{monsterstyle}, 1773 $rmp->{wallstyle}, $rmp->{wall_name}, $rmp->{floorstyle}, $rmp->{monsterstyle},
1765 $rmp->{treasurestyle}, $rmp->{layoutstyle}, $rmp->{doorstyle}, $rmp->{decorstyle}, 1774 $rmp->{treasurestyle}, $rmp->{layoutstyle}, $rmp->{doorstyle}, $rmp->{decorstyle}, $rmp->{miningstyle},
1766 $rmp->{origin_map}, $rmp->{final_map}, $rmp->{exitstyle}, $rmp->{this_map}, 1775 $rmp->{origin_map}, $rmp->{final_map}, $rmp->{exitstyle}, $rmp->{this_map},
1767 $rmp->{exit_on_final_map}, 1776 $rmp->{exit_on_final_map},
1768 $rmp->{xsize}, $rmp->{ysize}, 1777 $rmp->{xsize}, $rmp->{ysize},
1769 $rmp->{expand2x}, $rmp->{layoutoptions1}, $rmp->{layoutoptions2}, $rmp->{layoutoptions3}, 1778 $rmp->{expand2x}, $rmp->{layoutoptions1}, $rmp->{layoutoptions2}, $rmp->{layoutoptions3},
1770 $rmp->{symmetry}, $rmp->{difficulty}, $rmp->{difficulty_given}, $rmp->{difficulty_increase}, 1779 $rmp->{symmetry}, $rmp->{difficulty}, $rmp->{difficulty_given}, $rmp->{difficulty_increase},
2084 } 2093 }
2085 2094
2086 $self->post_load; 2095 $self->post_load;
2087} 2096}
2088 2097
2098# customize the map for a given player, i.e.
2099# return the _real_ map. used by e.g. per-player
2100# maps to change the path to ~playername/mappath
2089sub customise_for { 2101sub customise_for {
2090 my ($self, $ob) = @_; 2102 my ($self, $ob) = @_;
2091 2103
2092 return find "~" . $ob->name . "/" . $self->{path} 2104 return find "~" . $ob->name . "/" . $self->{path}
2093 if $self->per_player; 2105 if $self->per_player;
3564 }; 3576 };
3565 } 3577 }
3566} 3578}
3567 3579
3568sub write_runtime_sync { 3580sub write_runtime_sync {
3581 my $t0 = EV::time;
3582
3569 # first touch the runtime file to show we are still running: 3583 # first touch the runtime file to show we are still running:
3570 # the fsync below can take a very very long time. 3584 # the fsync below can take a very very long time.
3571 3585
3572 IO::AIO::aio_utime $RUNTIMEFILE, undef, undef; 3586 IO::AIO::aio_utime $RUNTIMEFILE, undef, undef;
3573 3587
3574 my $guard = cf::lock_acquire "write_runtime"; 3588 my $guard = cf::lock_acquire "write_runtime";
3575 3589
3576 my $fh = aio_open "$RUNTIMEFILE~", O_WRONLY | O_CREAT, 0644 3590 my $fh = aio_open "$RUNTIMEFILE~", O_WRONLY | O_CREAT | O_TRUNC, 0644
3577 or return; 3591 or return;
3578 3592
3579 my $value = $cf::RUNTIME + 90 + 10; 3593 my $value = $cf::RUNTIME + 90 + 10;
3580 # 10 is the runtime save interval, for a monotonic clock 3594 # 10 is the runtime save interval, for a monotonic clock
3581 # 60 allows for the watchdog to kill the server. 3595 # 60 allows for the watchdog to kill the server.
3594 or return; 3608 or return;
3595 3609
3596 aio_rename "$RUNTIMEFILE~", $RUNTIMEFILE 3610 aio_rename "$RUNTIMEFILE~", $RUNTIMEFILE
3597 and return; 3611 and return;
3598 3612
3599 warn "runtime file written.\n"; 3613 warn sprintf "runtime file written (%gs).\n", EV::time - $t0;
3600 3614
3601 1 3615 1
3602} 3616}
3603 3617
3604our $uuid_lock; 3618our $uuid_lock;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines