/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2009, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2010, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
* Steve McClure, 1996, 1998
* Doug Hay, 1998
* Ron Koenderink, 2004-2009
- * Markus Armbruster, 2005-2008
+ * Markus Armbruster, 2005-2009
*/
#include <config.h>
#include <unistd.h>
#if defined(_WIN32)
-#include <winsock2.h>
-#undef NS_ALL
#include <process.h>
#include "service.h"
+#include "sys/socket.h"
#endif
#include "empio.h"
#if defined(_WIN32)
static void loc_NTInit(void);
-static void loc_NTTerm(void);
#endif
/*
" -e CONFIG-FILE configuration file\n"
" (default %s)\n"
" -E ACTION what to do on oops: abort, crash-dump, nothing (default)\n"
- " -h display this help and exit\n"
#ifdef _WIN32
" -i install service `%s'\n"
" -I NAME install service NAME\n"
#endif
" -s enable stack checking\n"
" -R RANDOM-SEED random seed\n"
+ " -h display this help and exit\n"
" -v display version information and exit\n",
program_name, dflt_econfig
#ifdef _WIN32
}
}
+ /* silently ignore operands for backward compatibility */
+
#if defined(_WIN32)
if ((!daemonize || flags || config_file != NULL) &&
remove_service_set) {
if (journal_startup() < 0)
exit(1);
- empth_create(player_accept, 50 * 1024, flags, "AcceptPlayers", NULL);
-
market_init();
update_init();
+ empth_create(player_accept, 50 * 1024, flags, "AcceptPlayers", NULL);
}
/*
finish_server(void)
{
ef_fin_srv();
-#if defined(_WIN32)
- loc_NTTerm();
-#endif
journal_shutdown();
remove(pidfname);
}
shutdwn(int sig)
{
struct player *p;
+ time_t now;
+ int i, queues_drained;
logerror("Shutdown commencing (cleaning up threads.)");
empth_wakeup(p->proc);
}
empth_rwlock_wrlock(play_lock);
+
+ 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");
+ 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);
+ }
+
if (sig)
logerror("Server shutting down on signal %d", sig);
else
loc_NTInit(void)
{
int rc;
- WORD wVersionRequested;
- WSADATA wsaData;
- wVersionRequested = MAKEWORD(2, 0);
- rc = WSAStartup(wVersionRequested, &wsaData);
+ rc = w32_socket_init();
if (rc != 0) {
- logerror("WSAStartup failed. %d", rc);
+ logerror("WSAStartup Failed, error code %d\n", rc);
exit(1);
}
}
-
-static void
-loc_NTTerm(void)
-{
- WSACleanup();
-}
#endif