… | |
… | |
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; |
|
|
61 | |
|
|
62 | IO::AIO::max_poll_reqs 1;#d# |
58 | |
63 | |
59 | # configure various modules to our taste |
64 | # configure various modules to our taste |
60 | # |
65 | # |
61 | $Storable::canonical = 1; # reduce rsync transfers |
66 | $Storable::canonical = 1; # reduce rsync transfers |
62 | Coro::State::cctx_stacksize 256000; # 1-2MB stack, for deep recursions in maze generator |
67 | Coro::State::cctx_stacksize 256000; # 1-2MB stack, for deep recursions in maze generator |
… | |
… | |
90 | our $RANDOMDIR = "$LOCALDIR/random"; |
95 | our $RANDOMDIR = "$LOCALDIR/random"; |
91 | our $BDBDIR = "$LOCALDIR/db"; |
96 | our $BDBDIR = "$LOCALDIR/db"; |
92 | our %RESOURCE; |
97 | our %RESOURCE; |
93 | |
98 | |
94 | our $TICK = MAX_TIME * 1e-6; # this is a CONSTANT(!) |
99 | 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 |
100 | our $NEXT_RUNTIME_WRITE; # when should the runtime file be written |
97 | our $NEXT_TICK; |
101 | our $NEXT_TICK; |
98 | our $USE_FSYNC = 1; # use fsync to write maps - default off |
102 | our $USE_FSYNC = 1; # use fsync to write maps - default off |
99 | |
103 | |
100 | our $BDB_POLL_WATCHER; |
|
|
101 | our $BDB_DEADLOCK_WATCHER; |
104 | our $BDB_DEADLOCK_WATCHER; |
102 | our $BDB_CHECKPOINT_WATCHER; |
105 | our $BDB_CHECKPOINT_WATCHER; |
103 | our $BDB_TRICKLE_WATCHER; |
106 | our $BDB_TRICKLE_WATCHER; |
104 | our $DB_ENV; |
107 | our $DB_ENV; |
105 | |
108 | |
… | |
… | |
1523 | $pl->{deny_save} = 1; |
1526 | $pl->{deny_save} = 1; |
1524 | $pl->password ("*"); # this should lock out the player until we nuked the dir |
1527 | $pl->password ("*"); # this should lock out the player until we nuked the dir |
1525 | |
1528 | |
1526 | $pl->invoke (cf::EVENT_PLAYER_LOGOUT, 1) if $pl->active; |
1529 | $pl->invoke (cf::EVENT_PLAYER_LOGOUT, 1) if $pl->active; |
1527 | $pl->deactivate; |
1530 | $pl->deactivate; |
|
|
1531 | my $killer = cf::arch::get "killer_quit"; $pl->killer ($killer); $killer->destroy; |
|
|
1532 | $pl->ob->check_score; |
1528 | $pl->invoke (cf::EVENT_PLAYER_QUIT); |
1533 | $pl->invoke (cf::EVENT_PLAYER_QUIT); |
1529 | $pl->ns->destroy if $pl->ns; |
1534 | $pl->ns->destroy if $pl->ns; |
1530 | |
1535 | |
1531 | my $path = playerdir $pl; |
1536 | my $path = playerdir $pl; |
1532 | my $temp = "$path~$cf::RUNTIME~deleting~"; |
1537 | my $temp = "$path~$cf::RUNTIME~deleting~"; |
… | |
… | |
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 { |
… | |
… | |
3874 | # load additional modules |
3878 | # load additional modules |
3875 | use cf::pod; |
3879 | use cf::pod; |
3876 | |
3880 | |
3877 | END { cf::emergency_save } |
3881 | END { cf::emergency_save } |
3878 | |
3882 | |
|
|
3883 | evthread_start IO::AIO::poll_fileno; |
|
|
3884 | |
3879 | 1 |
3885 | 1 |
3880 | |
3886 | |