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.452 by root, Tue Sep 23 00:24:52 2008 UTC vs.
Revision 1.453 by root, Tue Sep 23 04:29:11 2008 UTC

128our $LOAD; # a number between 0 (idle) and 1 (too many objects) 128our $LOAD; # a number between 0 (idle) and 1 (too many objects)
129our $LOADAVG; # same thing, but with alpha-smoothing 129our $LOADAVG; # same thing, but with alpha-smoothing
130our $JITTER; # average jitter 130our $JITTER; # average jitter
131our $TICK_START; # for load detecting purposes 131our $TICK_START; # for load detecting purposes
132 132
133our @POST_INIT;
134
133binmode STDOUT; 135binmode STDOUT;
134binmode STDERR; 136binmode STDERR;
135 137
136# read virtual server time, if available 138# read virtual server time, if available
137unless ($RUNTIME || !-e $RUNTIMEFILE) { 139unless ($RUNTIME || !-e $RUNTIMEFILE) {
304 306
305our $json_coder = JSON::XS->new->utf8->max_size (1e6); # accept ~1mb max 307our $json_coder = JSON::XS->new->utf8->max_size (1e6); # accept ~1mb max
306 308
307sub encode_json($) { $json_coder->encode ($_[0]) } 309sub encode_json($) { $json_coder->encode ($_[0]) }
308sub decode_json($) { $json_coder->decode ($_[0]) } 310sub decode_json($) { $json_coder->decode ($_[0]) }
311
312=item cf::post_init { BLOCK }
313
314Execute the given codeblock, I<after> all extensions have been (re-)loaded,
315but I<before> the server starts ticking again.
316
317The cdoeblock will have a single boolean argument to indicate whether this
318is a reload or not.
319
320=cut
321
322sub post_init(&) {
323 push @POST_INIT, shift;
324}
309 325
310=item cf::lock_wait $string 326=item cf::lock_wait $string
311 327
312Wait until the given lock is available. See cf::lock_acquire. 328Wait until the given lock is available. See cf::lock_acquire.
313 329
3341 reload_treasures; 3357 reload_treasures;
3342 3358
3343 warn "finished reloading resource files\n"; 3359 warn "finished reloading resource files\n";
3344} 3360}
3345 3361
3346sub init {
3347 my $guard = freeze_mainloop;
3348
3349 evthread_start IO::AIO::poll_fileno;
3350
3351 reload_resources;
3352}
3353
3354sub reload_config { 3362sub reload_config {
3355 open my $fh, "<:utf8", "$CONFDIR/config" 3363 open my $fh, "<:utf8", "$CONFDIR/config"
3356 or return; 3364 or return;
3357 3365
3358 local $/; 3366 local $/;
3390 seek $fh, 0, 0; 3398 seek $fh, 0, 0;
3391 print $fh $$; 3399 print $fh $$;
3392} 3400}
3393 3401
3394sub main { 3402sub main {
3395 atomic; 3403 cf::init_globals; # initialise logging
3404
3405 LOG llevInfo, "Welcome to Deliantra, v" . VERSION;
3406 LOG llevInfo, "Copyright (C) 2005-2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team.";
3407 LOG llevInfo, "Copyright (C) 1994 Mark Wedel.";
3408 LOG llevInfo, "Copyright (C) 1992 Frank Tore Johansen.";
3409
3410 cf::init_experience;
3411 cf::init_anim;
3412 cf::init_attackmess;
3413 cf::init_dynamic;
3414 cf::init_block;
3415
3416 $Coro::current->prio (Coro::PRIO_MAX); # give the main loop max. priority
3396 3417
3397 # we must not ever block the main coroutine 3418 # we must not ever block the main coroutine
3398 local $Coro::idle = sub { 3419 local $Coro::idle = sub {
3399 Carp::cluck "FATAL: Coro::idle was called, major BUG, use cf::sync_job!\n";#d# 3420 Carp::cluck "FATAL: Coro::idle was called, major BUG, use cf::sync_job!\n";#d#
3400 (async { 3421 (async {
3401 $Coro::current->{desc} = "IDLE BUG HANDLER"; 3422 $Coro::current->{desc} = "IDLE BUG HANDLER";
3402 EV::loop EV::LOOP_ONESHOT; 3423 EV::loop EV::LOOP_ONESHOT;
3403 })->prio (Coro::PRIO_MAX); 3424 })->prio (Coro::PRIO_MAX);
3404 }; 3425 };
3405 3426
3406 { 3427 evthread_start IO::AIO::poll_fileno;
3407 my $guard = freeze_mainloop; 3428
3429 cf::sync_job {
3430 reload_resources;
3408 reload_config; 3431 reload_config;
3409 db_init; 3432 db_init;
3433
3434 cf::load_settings;
3435 cf::load_materials;
3436 cf::init_uuid;
3437 cf::init_signals;
3438 cf::init_commands;
3439 cf::init_skills;
3440
3441 cf::init_beforeplay;
3442
3443 atomic;
3444
3410 load_extensions; 3445 load_extensions;
3411 3446
3412 $Coro::current->prio (Coro::PRIO_MAX); # give the main loop max. priority
3413 }
3414
3415 utime time, time, $RUNTIMEFILE; 3447 utime time, time, $RUNTIMEFILE;
3416 3448
3417 # no (long-running) fork's whatsoever before this point(!) 3449 # no (long-running) fork's whatsoever before this point(!)
3418 POSIX::close delete $ENV{LOCKUTIL_LOCK_FD} if exists $ENV{LOCKUTIL_LOCK_FD}; 3450 POSIX::close delete $ENV{LOCKUTIL_LOCK_FD} if exists $ENV{LOCKUTIL_LOCK_FD};
3451
3452 (pop @POST_INIT)->(0) while @POST_INIT;
3453 };
3419 3454
3420 EV::loop; 3455 EV::loop;
3421} 3456}
3422 3457
3423############################################################################# 3458#############################################################################
3687 warn "reattaching attachments to maps"; 3722 warn "reattaching attachments to maps";
3688 reattach $_ for values %MAP; 3723 reattach $_ for values %MAP;
3689 warn "reattaching attachments to players"; 3724 warn "reattaching attachments to players";
3690 reattach $_ for values %PLAYER; 3725 reattach $_ for values %PLAYER;
3691 3726
3727 warn "running post_load";
3728 (pop @POST_INIT)->(1) while @POST_INIT;
3729
3692 warn "leaving sync_job"; 3730 warn "leaving sync_job";
3693 3731
3694 1 3732 1
3695 } or do { 3733 } or do {
3696 warn $@; 3734 warn $@;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines