]> git.pond.sub.org Git - empserver/blobdiff - src/server/main.c
Clean up superfluous includes
[empserver] / src / server / main.c
index 5ce3b02ece6c81dbe9819466d51cdd3bc7578a0e..44dbd626d5bdb740550cf298e81f277cdbf858ab 100644 (file)
@@ -31,7 +31,7 @@
  *     Steve McClure, 1996, 1998
  *     Doug Hay, 1998
  *     Ron Koenderink, 2004-2009
- *     Markus Armbruster, 2005-2010
+ *     Markus Armbruster, 2005-2011
  */
 
 #include <config.h>
 #include "empthread.h"
 #include "file.h"
 #include "journal.h"
-#include "land.h"
 #include "match.h"
 #include "misc.h"
-#include "nat.h"
-#include "nuke.h"
 #include "optlist.h"
 #include "plane.h"
 #include "player.h"
 #include "prototypes.h"
 #include "sect.h"
 #include "server.h"
-#include "ship.h"
 #include "version.h"
 
 static void ignore(void);
 static void crash_dump(void);
+static void init_server(unsigned, int);
 static void create_pidfile(char *, pid_t);
 
 #if defined(_WIN32)
@@ -137,6 +134,7 @@ main(int argc, char **argv)
     int remove_service_set = 0;
 #endif
     char *config_file = NULL;
+    int force_bad_state = 0;
     int op, idx, sig;
     unsigned seed = time(NULL);
 
@@ -147,7 +145,7 @@ main(int argc, char **argv)
 #else
 # define XOPTS
 #endif
-    while ((op = getopt(argc, argv, "de:E:hpsR:v" XOPTS)) != EOF) {
+    while ((op = getopt(argc, argv, "de:E:FhpsR:v" XOPTS)) != EOF) {
        switch (op) {
        case 'p':
            flags |= EMPTH_PRINT;
@@ -167,6 +165,9 @@ main(int argc, char **argv)
            }
            oops_handler = oops_hndlr[idx];
            break;
+       case 'F':
+           force_bad_state = 1;
+           break;
 #if defined(_WIN32)
        case 'I':
            service_name = optarg;
@@ -246,7 +247,7 @@ main(int argc, char **argv)
        return install_service(program_name, service_name, config_file);
 #endif /* _WIN32 */
 
-    init_server(seed);
+    init_server(seed, force_bad_state);
 
 #if defined(_WIN32)
     if (daemonize != 0) {
@@ -340,15 +341,15 @@ crash_dump(void)
 /*
  * Initialize for serving, acquire resources.
  */
-void
-init_server(unsigned seed)
+static void
+init_server(unsigned seed, int force_bad_state)
 {
     srandom(seed);
 #if defined(_WIN32)
     loc_NTInit();
 #endif
     player_init();
-    ef_init_srv();
+    ef_init_srv(force_bad_state);
     io_init();
     init_nreport();
 
@@ -406,7 +407,7 @@ shutdwn(int sig)
 {
     struct player *p;
     time_t now;
-    int i, queues_drained;
+    int i;
 
     logerror("Shutdown commencing (cleaning up threads.)");
 
@@ -414,9 +415,9 @@ shutdwn(int sig)
        if (p->state != PS_PLAYING)
            continue;
        pr_flash(p, "Server shutting down...\n");
-       p->state = PS_SHUTDOWN;
+       io_set_eof(p->iop);
+       p->aborted = 1;
        p->may_sleep = PLAYER_SLEEP_NEVER;
-       p->aborted++;
        if (p->command) {
            pr_flash(p, "Shutdown aborting command\n");
        }
@@ -426,22 +427,13 @@ shutdwn(int sig)
 
     now = time(NULL);
     empth_yield();
-    for (i = 1; i <= 3; i++) {
-       queues_drained = 1;
-       for (p = player_next(NULL); p; p = player_next(p)) {
-           if (io_outputwaiting(p->iop))
-               queues_drained = 0;
-       }
-       if (queues_drained)
-           break;
-       logerror("Waiting for player output to drain\n");
+    for (i = 1; i <= 3 && player_next(NULL); i++) {
+       logerror("Waiting for player threads to terminate\n");
        empth_sleep(now + i);
     }
 
-    for (p = player_next(NULL); p; p = player_next(p)) {
-       if (io_outputwaiting(p->iop))
-           logerror("Output for player %d lost", p->cnum);
-    }
+    for (p = player_next(NULL); p; p = player_next(p))
+       logerror("Player %d lingers, output might be lost", p->cnum);
 
     if (sig)
        logerror("Server shutting down on signal %d", sig);