… | |
… | |
10 | use Opcode; |
10 | use Opcode; |
11 | use Safe; |
11 | use Safe; |
12 | use Safe::Hole; |
12 | use Safe::Hole; |
13 | use Storable (); |
13 | use Storable (); |
14 | |
14 | |
15 | use Coro 4.1 (); |
15 | use Coro 4.32 (); |
16 | use Coro::State; |
16 | use Coro::State; |
17 | use Coro::Handle; |
17 | use Coro::Handle; |
18 | use Coro::EV; |
18 | use Coro::EV; |
19 | use Coro::Timer; |
19 | use Coro::Timer; |
20 | use Coro::Signal; |
20 | use Coro::Signal; |
21 | use Coro::Semaphore; |
21 | use Coro::Semaphore; |
22 | use Coro::AIO; |
22 | use Coro::AIO; |
|
|
23 | use Coro::BDB; |
23 | use Coro::Storable; |
24 | use Coro::Storable; |
24 | use Coro::Util (); |
25 | use Coro::Util (); |
25 | |
26 | |
26 | use JSON::XS 2.01 (); |
27 | use JSON::XS 2.01 (); |
27 | use BDB (); |
28 | use BDB (); |
… | |
… | |
74 | our $TICK = MAX_TIME * 1e-6; # this is a CONSTANT(!) |
75 | our $TICK = MAX_TIME * 1e-6; # this is a CONSTANT(!) |
75 | our $TICK_WATCHER; |
76 | our $TICK_WATCHER; |
76 | our $AIO_POLL_WATCHER; |
77 | our $AIO_POLL_WATCHER; |
77 | our $NEXT_RUNTIME_WRITE; # when should the runtime file be written |
78 | our $NEXT_RUNTIME_WRITE; # when should the runtime file be written |
78 | our $NEXT_TICK; |
79 | our $NEXT_TICK; |
79 | our $NOW; |
|
|
80 | our $USE_FSYNC = 1; # use fsync to write maps - default off |
80 | our $USE_FSYNC = 1; # use fsync to write maps - default off |
81 | |
81 | |
82 | our $BDB_POLL_WATCHER; |
82 | our $BDB_POLL_WATCHER; |
83 | our $BDB_DEADLOCK_WATCHER; |
83 | our $BDB_DEADLOCK_WATCHER; |
84 | our $BDB_CHECKPOINT_WATCHER; |
84 | our $BDB_CHECKPOINT_WATCHER; |
… | |
… | |
87 | |
87 | |
88 | our %CFG; |
88 | our %CFG; |
89 | |
89 | |
90 | our $UPTIME; $UPTIME ||= time; |
90 | our $UPTIME; $UPTIME ||= time; |
91 | our $RUNTIME; |
91 | our $RUNTIME; |
|
|
92 | our $NOW; |
92 | |
93 | |
93 | our (%PLAYER, %PLAYER_LOADING); # all users |
94 | our (%PLAYER, %PLAYER_LOADING); # all users |
94 | our (%MAP, %MAP_LOADING ); # all maps |
95 | our (%MAP, %MAP_LOADING ); # all maps |
95 | our $LINK_MAP; # the special {link} map, which is always available |
96 | our $LINK_MAP; # the special {link} map, which is always available |
96 | |
97 | |
… | |
… | |
3606 | |
3607 | |
3607 | $RUNTIME += $TICK; |
3608 | $RUNTIME += $TICK; |
3608 | $NEXT_TICK += $TICK; |
3609 | $NEXT_TICK += $TICK; |
3609 | |
3610 | |
3610 | if ($NOW >= $NEXT_RUNTIME_WRITE) { |
3611 | if ($NOW >= $NEXT_RUNTIME_WRITE) { |
3611 | $NEXT_RUNTIME_WRITE = $NOW + 10; |
3612 | $NEXT_RUNTIME_WRITE = List::Util::max $NEXT_RUNTIME_WRITE + 10, $NOW + 5.; |
3612 | Coro::async_pool { |
3613 | Coro::async_pool { |
3613 | $Coro::current->{desc} = "runtime saver"; |
3614 | $Coro::current->{desc} = "runtime saver"; |
3614 | write_runtime |
3615 | write_runtime |
3615 | or warn "ERROR: unable to write runtime file: $!"; |
3616 | or warn "ERROR: unable to write runtime file: $!"; |
3616 | }; |
3617 | }; |
… | |
… | |
3629 | _post_tick; |
3630 | _post_tick; |
3630 | }; |
3631 | }; |
3631 | $TICK_WATCHER->priority (EV::MAXPRI); |
3632 | $TICK_WATCHER->priority (EV::MAXPRI); |
3632 | |
3633 | |
3633 | { |
3634 | { |
|
|
3635 | # configure BDB |
|
|
3636 | |
3634 | BDB::min_parallel 8; |
3637 | BDB::min_parallel 8; |
3635 | BDB::max_poll_time $TICK * 0.1; |
3638 | BDB::max_poll_reqs $TICK * 0.1; |
3636 | $BDB_POLL_WATCHER = EV::io BDB::poll_fileno, EV::READ, \&BDB::poll_cb; |
3639 | $Coro::BDB::WATCHER->priority (1); |
3637 | |
|
|
3638 | BDB::set_sync_prepare { |
|
|
3639 | my $status; |
|
|
3640 | my $current = $Coro::current; |
|
|
3641 | ( |
|
|
3642 | sub { |
|
|
3643 | $status = $!; |
|
|
3644 | $current->ready; undef $current; |
|
|
3645 | }, |
|
|
3646 | sub { |
|
|
3647 | Coro::schedule while defined $current; |
|
|
3648 | $! = $status; |
|
|
3649 | }, |
|
|
3650 | ) |
|
|
3651 | }; |
|
|
3652 | |
3640 | |
3653 | unless ($DB_ENV) { |
3641 | unless ($DB_ENV) { |
3654 | $DB_ENV = BDB::db_env_create; |
3642 | $DB_ENV = BDB::db_env_create; |
3655 | $DB_ENV->set_flags (BDB::AUTO_COMMIT | BDB::REGION_INIT | BDB::TXN_NOSYNC |
3643 | $DB_ENV->set_flags (BDB::AUTO_COMMIT | BDB::REGION_INIT | BDB::TXN_NOSYNC |
3656 | | BDB::LOG_AUTOREMOVE, 1); |
3644 | | BDB::LOG_AUTOREMOVE, 1); |
… | |
… | |
3683 | BDB::db_env_memp_trickle $DB_ENV, 20, 0, sub { }; |
3671 | BDB::db_env_memp_trickle $DB_ENV, 20, 0, sub { }; |
3684 | }; |
3672 | }; |
3685 | } |
3673 | } |
3686 | |
3674 | |
3687 | { |
3675 | { |
|
|
3676 | # configure IO::AIO |
|
|
3677 | |
3688 | IO::AIO::min_parallel 8; |
3678 | IO::AIO::min_parallel 8; |
3689 | |
|
|
3690 | undef $Coro::AIO::WATCHER; |
|
|
3691 | IO::AIO::max_poll_time $TICK * 0.1; |
3679 | IO::AIO::max_poll_time $TICK * 0.1; |
3692 | $AIO_POLL_WATCHER = EV::io IO::AIO::poll_fileno, EV::READ, \&IO::AIO::poll_cb; |
3680 | $Coro::AIO::WATCHER->priority (1); |
3693 | } |
3681 | } |
3694 | |
3682 | |
3695 | my $_log_backtrace; |
3683 | my $_log_backtrace; |
3696 | |
3684 | |
3697 | sub _log_backtrace { |
3685 | sub _log_backtrace { |