From a2306446c86b3333e69b082e41ae76ba71a42d9d Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Thu, 24 Mar 2011 13:57:13 -0700 Subject: Optimize common objects, and adjust other objects accordingly. Major changes still need to be made to each of the servers. --- src/common/core.c | 132 +++++++++--------------------------------------------- 1 file changed, 21 insertions(+), 111 deletions(-) (limited to 'src/common/core.c') diff --git a/src/common/core.c b/src/common/core.c index bf48dfc..2b1b67c 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -1,11 +1,6 @@ -// $Id: core.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $ -// original : core.c 2003/02/26 18:03:12 Rev 1.7 - #include #include -#ifndef LCCWIN32 #include -#endif #include #include @@ -14,84 +9,23 @@ #include "timer.h" #include "version.h" #include "mt_rand.h" +#include "nullpo.h" -#ifdef MEMWATCH -#include "memwatch.h" -#endif - -static void (*term_func) (void) = NULL; - -/*====================================== - * CORE : Set function - *-------------------------------------- - */ -void set_termfunc (void (*termfunc) (void)) -{ - term_func = termfunc; -} - -/*====================================== - * CORE : Signal Sub Function - *-------------------------------------- - */ +/// Defined by each server +extern int do_init (int, char **); +extern void term_func (void); -static void sig_proc (int sn) +static void chld_proc (int UNUSED) { - int i; - switch (sn) - { - case SIGINT: - case SIGTERM: - if (term_func) - term_func (); - for (i = 0; i < fd_max; i++) - { - if (!session[i]) - continue; - close (i); - } - exit (0); - break; - case SIGCHLD: - wait (&i); - break; - } + wait(NULL); } - -int eathena_interactive_session = 1; // [fate] interactive session: print pretty graphics - -/*====================================== - * CORE : Display title - *-------------------------------------- - */ - -static void display_title (void) +static void sig_proc (int UNUSED) { - // for help with the console colors look here: - // http://www.edoceo.com/liberum/?doc=printf-with-color - // some code explanation (used here): - // \033[2J : clear screen and go up/left (0, 0 position) - // \033[K : clear line from actual position to end of the line - // \033[0m : reset color parameter - // \033[1m : use bold for font - if (eathena_interactive_session) - { - printf ("\033[2J"); // clear screen and go up/left (0, 0 position in text) - printf ("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n"); // white writing (37) on blue background (44), \033[K clean until end of file - printf ("\033[0;44m (\033[1;33m (c)2004 eAthena Development Team presents \033[0;44m)\033[K\033[0m\n"); // yellow writing (33) - printf ("\033[0;44m (\033[1m ______ __ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m /\\ _ \\/\\ \\__/\\ \\ v%2d.%02d.%02d \033[0;44m)\033[K\033[0m\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___ __ ___ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m /'__`\\ \\ __ \\ \\ \\/\\ \\ _ `\\ /'__`\\/' _ `\\ /'__`\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m /\\ __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ __//\\ \\/\\ \\/\\ \\_\\.\\_ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m _ _ _ _ _ _ _ _ _ _ _ _ _ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[0;44m (\033[1m \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf ("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n"); // reset color - } + term_func (); + for (int i = 0; i < fd_max; i++) + if (session[i]) + close (i); + exit (0); } // Added by Gabuzomeu @@ -100,69 +34,45 @@ static void display_title (void) // (sigaction() is POSIX; signal() is not.) Taken from Stevens' _Advanced // Programming in the UNIX Environment_. // -#ifndef SIGPIPE -#define SIGPIPE SIGINT -#endif - -#ifndef POSIX -#define compat_signal(signo, func) signal(signo, func) -#else -sigfunc *compat_signal (int signo, sigfunc * func) +typedef void (*sigfunc)(int); +sigfunc compat_signal (int signo, sigfunc func) { struct sigaction sact, oact; sact.sa_handler = func; sigemptyset (&sact.sa_mask); sact.sa_flags = 0; -#ifdef SA_INTERRUPT - sact.sa_flags |= SA_INTERRUPT; /* SunOS */ -#endif if (sigaction (signo, &sact, &oact) < 0) - return (SIG_ERR); + return SIG_ERR; - return (oact.sa_handler); + return oact.sa_handler; } -#endif -/*====================================== - * CORE : MAINROUTINE - *-------------------------------------- - */ - -int runflag = 1; +bool runflag = true; int main (int argc, char **argv) { - int next; - - mt_seed (time (NULL) ^ getpid () ^ getppid ()); + /// Note that getpid() and getppid() may be very close + mt_seed (time (NULL) ^ (getpid () << 16) ^ (getppid () << 8)); - Net_Init (); do_socket (); compat_signal (SIGPIPE, SIG_IGN); compat_signal (SIGTERM, sig_proc); compat_signal (SIGINT, sig_proc); - compat_signal (SIGCHLD, sig_proc); + compat_signal (SIGCHLD, chld_proc); // Signal to create coredumps by system when necessary (crash) compat_signal (SIGSEGV, SIG_DFL); -#ifndef LCCWIN32 compat_signal (SIGBUS, SIG_DFL); compat_signal (SIGTRAP, SIG_DFL); -#endif compat_signal (SIGILL, SIG_DFL); - // [fate] detect interactive session - eathena_interactive_session = isatty (0); - display_title (); do_init (argc, argv); while (runflag) { - next = do_timer (gettick_nocache ()); - do_sendrecv (next); + do_sendrecv (do_timer (gettick_nocache ())); do_parsepacket (); } - return 0; } -- cgit v1.2.3-70-g09d2