… | |
… | |
25 | use strict; |
25 | use strict; |
26 | |
26 | |
27 | use Symbol; |
27 | use Symbol; |
28 | use List::Util; |
28 | use List::Util; |
29 | use Socket; |
29 | use Socket; |
30 | use EV 3.2; |
30 | use EV; |
31 | use Opcode; |
31 | use Opcode; |
32 | use Safe; |
32 | use Safe; |
33 | use Safe::Hole; |
33 | use Safe::Hole; |
34 | use Storable (); |
34 | use Storable (); |
35 | |
35 | |
36 | use Coro 4.50 (); |
36 | use Coro (); |
37 | use Coro::State; |
37 | use Coro::State; |
38 | use Coro::Handle; |
38 | use Coro::Handle; |
39 | use Coro::EV; |
39 | use Coro::AnyEvent; |
40 | use Coro::Timer; |
40 | use Coro::Timer; |
41 | use Coro::Signal; |
41 | use Coro::Signal; |
42 | use Coro::Semaphore; |
42 | use Coro::Semaphore; |
|
|
43 | use Coro::AnyEvent; |
43 | use Coro::AIO; |
44 | use Coro::AIO; |
44 | use Coro::BDB; |
45 | use Coro::BDB; |
45 | use Coro::Storable; |
46 | use Coro::Storable; |
46 | use Coro::Util (); |
47 | use Coro::Util (); |
47 | |
48 | |
… | |
… | |
49 | use BDB (); |
50 | use BDB (); |
50 | use Data::Dumper; |
51 | use Data::Dumper; |
51 | use Digest::MD5; |
52 | use Digest::MD5; |
52 | use Fcntl; |
53 | use Fcntl; |
53 | use YAML (); |
54 | use YAML (); |
54 | use IO::AIO 2.51 (); |
55 | use IO::AIO (); |
55 | use Time::HiRes; |
56 | use Time::HiRes; |
56 | use Compress::LZF; |
57 | use Compress::LZF; |
57 | use Digest::MD5 (); |
58 | use Digest::MD5 (); |
|
|
59 | |
|
|
60 | AnyEvent::detect; |
58 | |
61 | |
59 | # configure various modules to our taste |
62 | # configure various modules to our taste |
60 | # |
63 | # |
61 | $Storable::canonical = 1; # reduce rsync transfers |
64 | $Storable::canonical = 1; # reduce rsync transfers |
62 | Coro::State::cctx_stacksize 256000; # 1-2MB stack, for deep recursions in maze generator |
65 | Coro::State::cctx_stacksize 256000; # 1-2MB stack, for deep recursions in maze generator |
… | |
… | |
90 | our $RANDOMDIR = "$LOCALDIR/random"; |
93 | our $RANDOMDIR = "$LOCALDIR/random"; |
91 | our $BDBDIR = "$LOCALDIR/db"; |
94 | our $BDBDIR = "$LOCALDIR/db"; |
92 | our %RESOURCE; |
95 | our %RESOURCE; |
93 | |
96 | |
94 | our $TICK = MAX_TIME * 1e-6; # this is a CONSTANT(!) |
97 | our $TICK = MAX_TIME * 1e-6; # this is a CONSTANT(!) |
95 | our $AIO_POLL_WATCHER; |
|
|
96 | our $NEXT_RUNTIME_WRITE; # when should the runtime file be written |
98 | our $NEXT_RUNTIME_WRITE; # when should the runtime file be written |
97 | our $NEXT_TICK; |
99 | our $NEXT_TICK; |
98 | our $USE_FSYNC = 1; # use fsync to write maps - default off |
100 | our $USE_FSYNC = 1; # use fsync to write maps - default off |
99 | |
101 | |
100 | our $BDB_POLL_WATCHER; |
|
|
101 | our $BDB_DEADLOCK_WATCHER; |
102 | our $BDB_DEADLOCK_WATCHER; |
102 | our $BDB_CHECKPOINT_WATCHER; |
103 | our $BDB_CHECKPOINT_WATCHER; |
103 | our $BDB_TRICKLE_WATCHER; |
104 | our $BDB_TRICKLE_WATCHER; |
104 | our $DB_ENV; |
105 | our $DB_ENV; |
105 | |
106 | |
… | |
… | |
1523 | $pl->{deny_save} = 1; |
1524 | $pl->{deny_save} = 1; |
1524 | $pl->password ("*"); # this should lock out the player until we nuked the dir |
1525 | $pl->password ("*"); # this should lock out the player until we nuked the dir |
1525 | |
1526 | |
1526 | $pl->invoke (cf::EVENT_PLAYER_LOGOUT, 1) if $pl->active; |
1527 | $pl->invoke (cf::EVENT_PLAYER_LOGOUT, 1) if $pl->active; |
1527 | $pl->deactivate; |
1528 | $pl->deactivate; |
|
|
1529 | my $killer = cf::arch::get "killer_quit"; $pl->killer ($killer); $killer->destroy; |
|
|
1530 | $pl->ob->check_score; |
1528 | $pl->invoke (cf::EVENT_PLAYER_QUIT); |
1531 | $pl->invoke (cf::EVENT_PLAYER_QUIT); |
1529 | $pl->ns->destroy if $pl->ns; |
1532 | $pl->ns->destroy if $pl->ns; |
1530 | |
1533 | |
1531 | my $path = playerdir $pl; |
1534 | my $path = playerdir $pl; |
1532 | my $temp = "$path~$cf::RUNTIME~deleting~"; |
1535 | my $temp = "$path~$cf::RUNTIME~deleting~"; |
… | |
… | |
3393 | } |
3396 | } |
3394 | |
3397 | |
3395 | sub init { |
3398 | sub init { |
3396 | my $guard = freeze_mainloop; |
3399 | my $guard = freeze_mainloop; |
3397 | |
3400 | |
|
|
3401 | evthread_start IO::AIO::poll_fileno; |
|
|
3402 | |
3398 | reload_resources; |
3403 | reload_resources; |
3399 | } |
3404 | } |
3400 | |
3405 | |
3401 | sub reload_config { |
3406 | sub reload_config { |
3402 | open my $fh, "<:utf8", "$CONFDIR/config" |
3407 | open my $fh, "<:utf8", "$CONFDIR/config" |
… | |
… | |
3434 | reload_config; |
3439 | reload_config; |
3435 | db_init; |
3440 | db_init; |
3436 | load_extensions; |
3441 | load_extensions; |
3437 | |
3442 | |
3438 | $Coro::current->prio (Coro::PRIO_MAX); # give the main loop max. priority |
3443 | $Coro::current->prio (Coro::PRIO_MAX); # give the main loop max. priority |
3439 | evthread_start IO::AIO::poll_fileno; |
|
|
3440 | } |
3444 | } |
3441 | |
3445 | |
3442 | EV::loop; |
3446 | EV::loop; |
3443 | } |
3447 | } |
3444 | |
3448 | |
… | |
… | |
3785 | { |
3789 | { |
3786 | # configure BDB |
3790 | # configure BDB |
3787 | |
3791 | |
3788 | BDB::min_parallel 8; |
3792 | BDB::min_parallel 8; |
3789 | BDB::max_poll_reqs $TICK * 0.1; |
3793 | BDB::max_poll_reqs $TICK * 0.1; |
3790 | $Coro::BDB::WATCHER->priority (1); |
3794 | $AnyEvent::BDB::WATCHER->priority (1); |
3791 | |
3795 | |
3792 | unless ($DB_ENV) { |
3796 | unless ($DB_ENV) { |
3793 | $DB_ENV = BDB::db_env_create; |
3797 | $DB_ENV = BDB::db_env_create; |
3794 | $DB_ENV->set_flags (BDB::AUTO_COMMIT | BDB::REGION_INIT | BDB::TXN_NOSYNC |
3798 | $DB_ENV->set_flags (BDB::AUTO_COMMIT | BDB::REGION_INIT | BDB::TXN_NOSYNC |
3795 | | BDB::LOG_AUTOREMOVE, 1); |
3799 | | BDB::LOG_AUTOREMOVE, 1); |
… | |
… | |
3826 | { |
3830 | { |
3827 | # configure IO::AIO |
3831 | # configure IO::AIO |
3828 | |
3832 | |
3829 | IO::AIO::min_parallel 8; |
3833 | IO::AIO::min_parallel 8; |
3830 | IO::AIO::max_poll_time $TICK * 0.1; |
3834 | IO::AIO::max_poll_time $TICK * 0.1; |
3831 | $Coro::AIO::WATCHER->priority (1); |
3835 | undef $AnyEvent::AIO::WATCHER; |
3832 | } |
3836 | } |
3833 | |
3837 | |
3834 | my $_log_backtrace; |
3838 | my $_log_backtrace; |
3835 | |
3839 | |
3836 | sub _log_backtrace { |
3840 | sub _log_backtrace { |