static void* MainChatbotServer() { sprintf(serverLogfileName,"LOGS/serverlog%d.txt",port); ServerStartup(); // get initial control over the mutex so we can start. - on linux if thread dies, we must reacquire here // we now own the chatlock clock_t lastTime = ElapsedMilliseconds(); if (setjmp(scriptJump[MAIN_RECOVERY])) // crashes come back to here { printf("***Server exception\r\n"); ReportBug("***Server exception\r\n"); #ifdef WIN32 char* bad = GetUserVariable("$crashmsg"); if (*bad) strcpy(outputFeed,bad); else strcpy(outputFeed,"Hey, sorry. I forgot what I was thinking about."); ServerTransferDataToClient(""); #endif ResetBuffers(); // in the event of a trapped bug, return here, we will still own the chatlock } chatbotExists = true; // if a client can get the chatlock now, he will be happy Log(SERVERLOG,"Server ready\r\n"); printf("Server ready: %s\r\n",serverLogfileName); #ifdef WIN32 _try { // catch crashes in windows #endif int counter = 0; while (1) { ServerGetChatLock(); startServerTime = ElapsedMilliseconds(); // chatlock mutex controls whether server is processing data or client can hand server data. // That we now have it means a client has data for us. // we own the chatLock again from here on so no new client can try to pass in data. // CLIENT has passed server in globals: clientBuffer (ip,user,bot,message) // We will send back his answer in clientBuffer, overwriting it. char user[MAX_WORD_SIZE]; char bot[MAX_WORD_SIZE]; char* ip = clientBuffer; char* ptr = ip; // incoming is 4 strings together: ip, username, botname, message ptr += strlen(ip) + 1; // ptr to username strcpy(user,ptr); // allow user var to be overwriteable, hence a copy ptr += strlen(ptr) + 1; // ptr to botname strcpy(bot,ptr); ptr += strlen(ptr) + 1; // ptr to message strcpy(inputFeed,ptr); // xfer user message to our incoming feed echo = false; PerformChat(user,bot,inputFeed,ip,outputFeed); // this takes however long it takes, exclusive control of chatbot. #ifdef STATSERVER clock_t now = ElapsedMilliseconds(); if ( (now / 1000) > (lastTime / 1000)) // starting different second { printf("%d\r\n",counter); counter = 0; lastTime = now; } ++counter; if ((now-startServerTime) > 2000) { printf("Compute Stall? %d\r\n",now-startServerTime); } #endif ServerTransferDataToClient(priorMessage); } #ifdef WIN32 }_except (true) { ReportBug("crash\r\n"); Crash();} #endif return NULL; }
int InitGUI (void) { int step = 1; // Save original termio #ifndef _STAND_ALONE if (mgIsServer) #endif tcgetattr (0, &savedtermio); if (!InitMisc ()) { err_message (step, "Can not initialize miscellous things!"); return step; } step++; #ifndef _STAND_ALONE if (mgIsServer && !IsOnlyMe ()) { err_message (step, "There is already an instance of 'mginit'!"); return step; } step++; #endif // Init GAL engine. switch (InitGAL ()) { case ERR_CONFIG_FILE: err_message (step, "Reading configuration failure!"); return step; case ERR_NO_ENGINE: err_message (step, "No graphics engine defined!"); return step; case ERR_NO_MATCH: err_message (step, "Can not get graphics engine information!"); return step; case ERR_GFX_ENGINE: err_message (step, "Can not initialize graphics engine!"); return step; } step++; atexit (TerminateGAL); /* install signal handlers */ #ifndef _STAND_ALONE if (mgIsServer) #endif InstallSEGVHandler (); if (!InitGDI ()) { err_message (step, "MiniGUI: Initialization of GDI resource failure!\n"); return step; } step++; atexit (TerminateGDI); /* Init Screen DC here */ if (!InitScreenDC ()) { err_message (step, "Can not initialize screen DC!"); return step; } step++; atexit (TerminateScreenDC); g_rcScr.left = 0; g_rcScr.top = 0; g_rcScr.right = GetGDCapability (HDC_SCREEN, GDCAP_MAXX) + 1; g_rcScr.bottom = GetGDCapability (HDC_SCREEN, GDCAP_MAXY) + 1; if (!InitWindowElementColors ()) { err_message (step, "Can not initialize colors of window element!"); return step; } step++; #ifndef _STAND_ALONE if (mgIsServer) { // Load shared resource and create shared memory. if ((mgSharedRes = LoadSharedResource ()) == NULL) { err_message (step, "Can not load shared resource!"); return step; } atexit (UnloadSharedResource); SHAREDRES_TERMIOS = savedtermio; } else { if ((mgSharedRes = AttachSharedResource ()) == NULL) { err_message (step, "Can not attach shared resource!"); return step; } atexit (UnattachSharedResource); } step++; #endif // Initialize resource if (!InitResource ()) { err_message (step, "Can not initialize resource!"); return step; } step++; #ifdef _STAND_ALONE // Init IAL engine.. if (!InitLWEvent ()) { err_message (step, "Can not initialize low level event!"); return step; } step++; atexit (TerminateLWEvent); __mg_dsk_msgs.OnIdle = IdleHandler4StandAlone; if (!StandAloneStartup ()) { fprintf (stderr, "Can not start MiniGUI-Lite StandAlone version.\n"); return step; } #else if (mgIsServer) { // Init IAL engine.. if (!InitLWEvent ()) { err_message (step, "Can not initialize low level event!"); return step; } step++; atexit (TerminateLWEvent); __mg_dsk_msgs.OnIdle = IdleHandler4Server; if (!ServerStartup ()) { fprintf (stderr, "Can not start the server of MiniGUI-Lite: mginit.\n"); return step; } } else { if (!ClientStartup ()) { err_message (step, "Can not start client!"); return step; } step++; __mg_dsk_msgs.OnIdle = IdleHandler4Client; } #endif SetKeyboardLayout ("default"); TerminateMgEtc (); return 0; }