… | |
… | |
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 | |
… | |
… | |
3395 | } |
3396 | } |
3396 | |
3397 | |
3397 | sub init { |
3398 | sub init { |
3398 | my $guard = freeze_mainloop; |
3399 | my $guard = freeze_mainloop; |
3399 | |
3400 | |
|
|
3401 | evthread_start IO::AIO::poll_fileno; |
|
|
3402 | |
3400 | reload_resources; |
3403 | reload_resources; |
3401 | } |
3404 | } |
3402 | |
3405 | |
3403 | sub reload_config { |
3406 | sub reload_config { |
3404 | open my $fh, "<:utf8", "$CONFDIR/config" |
3407 | open my $fh, "<:utf8", "$CONFDIR/config" |
… | |
… | |
3436 | reload_config; |
3439 | reload_config; |
3437 | db_init; |
3440 | db_init; |
3438 | load_extensions; |
3441 | load_extensions; |
3439 | |
3442 | |
3440 | $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 |
3441 | evthread_start IO::AIO::poll_fileno; |
|
|
3442 | } |
3444 | } |
3443 | |
3445 | |
3444 | EV::loop; |
3446 | EV::loop; |
3445 | } |
3447 | } |
3446 | |
3448 | |
… | |
… | |
3787 | { |
3789 | { |
3788 | # configure BDB |
3790 | # configure BDB |
3789 | |
3791 | |
3790 | BDB::min_parallel 8; |
3792 | BDB::min_parallel 8; |
3791 | BDB::max_poll_reqs $TICK * 0.1; |
3793 | BDB::max_poll_reqs $TICK * 0.1; |
3792 | $Coro::BDB::WATCHER->priority (1); |
3794 | $AnyEvent::BDB::WATCHER->priority (1); |
3793 | |
3795 | |
3794 | unless ($DB_ENV) { |
3796 | unless ($DB_ENV) { |
3795 | $DB_ENV = BDB::db_env_create; |
3797 | $DB_ENV = BDB::db_env_create; |
3796 | $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 |
3797 | | BDB::LOG_AUTOREMOVE, 1); |
3799 | | BDB::LOG_AUTOREMOVE, 1); |
… | |
… | |
3828 | { |
3830 | { |
3829 | # configure IO::AIO |
3831 | # configure IO::AIO |
3830 | |
3832 | |
3831 | IO::AIO::min_parallel 8; |
3833 | IO::AIO::min_parallel 8; |
3832 | IO::AIO::max_poll_time $TICK * 0.1; |
3834 | IO::AIO::max_poll_time $TICK * 0.1; |
3833 | $Coro::AIO::WATCHER->priority (1); |
3835 | undef $AnyEvent::AIO::WATCHER; |
3834 | } |
3836 | } |
3835 | |
3837 | |
3836 | my $_log_backtrace; |
3838 | my $_log_backtrace; |
3837 | |
3839 | |
3838 | sub _log_backtrace { |
3840 | sub _log_backtrace { |