void RunMainLoop(void) { INT64 ms; const uint32_t num_notify_events = 500; struct epoll_event notify_events[num_notify_events]; int i; signal(SIGPIPE, SIG_IGN); while (!GetQuit()) { ms = GetMainLoopWaitTime(); // wait up to ms, dispatch any socket events int val = epoll_wait(fd_epoll, notify_events, num_notify_events, ms); if (val == -1) { eprintf("RunMainLoop error on epoll_wait %s\n", GetLastErrorStr()); } //printf("got events %i %lu\n", val, ms); for (i=0;i<val;i++) { if (notify_events[i].events == 0) continue; if (IsAcceptingSocket(notify_events[i].data.fd)) { if (notify_events[i].events & ~EPOLLIN) { eprintf("RunMainLoop error on accepting socket %i\n",notify_events[i].data.fd); } else { AsyncSocketAccept(notify_events[i].data.fd,FD_ACCEPT,0,GetAcceptingSocketConnectionType(notify_events[i].data.fd)); } } else { if (notify_events[i].events & ~(EPOLLIN | EPOLLOUT)) { // this means there was an error AsyncSocketSelect(notify_events[i].data.fd,0,1); } else { if (notify_events[i].events & EPOLLIN) { AsyncSocketSelect(notify_events[i].data.fd,FD_READ,0); } if (notify_events[i].events & EPOLLOUT) { AsyncSocketSelect(notify_events[i].data.fd,FD_WRITE,0); } } } } EnterServerLock(); PollSessions(); /* really just need to check session timers */ TimerActivate(); LeaveServerLock(); } close(fd_epoll); }
long WINAPI InterfaceWindowProc(HWND hwnd,UINT message,UINT wParam,LONG lParam) { char buf[40]; switch (message) { case WM_CREATE : InterfaceCreate(hwnd,wParam,lParam); break; HANDLE_MSG(hwnd,WM_COMMAND,InterfaceCommand); case WM_DESTROY : SetQuit(); PostQuitMessage(0); return 0; case WM_CLOSE : if (MessageBox(hwnd,"Are you sure you want to exit?",BlakServNameString(), MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION) == IDYES) { DestroyWindow(hwnd); } break; case WM_TIMER : KillTimer(hwndMain,WIN_TIMER_ID); SendDlgItemMessage(hwndMain,IDS_STATUS_WINDOW,SB_SETTEXT,0,(LPARAM)""); break; case WM_NOTIFY: switch (((LPNMHDR) lParam)->code) { case TTN_NEEDTEXT: { LPTOOLTIPTEXT lpttt; lpttt = (LPTOOLTIPTEXT) lParam; lpttt->hinst = hInst; /* Specify the resource identifier of the descriptive text for the given button. */ switch (lpttt->hdr.idFrom) { case IDM_FILE_EXIT : lpttt->lpszText = "Exit"; break; case IDM_FILE_SAVE : lpttt->lpszText = "Save Game"; break; case IDM_FILE_RELOADSYSTEM : lpttt->lpszText = "Reload System"; break; case IDM_MESSAGES_MESSAGEOFTHEDAY : lpttt->lpszText = "Message of the Day"; break; case IDM_HELP_ABOUT : lpttt->lpszText = "About"; break; } break; } break; case TCN_SELCHANGE : InterfaceTabChange(); break; case TCN_SELCHANGING : return FALSE; /* means we'll allow it to change */ break; } break; case WM_BLAK_NEW_INFO : InterfaceDrawText(hwnd); break; case WM_BLAK_LOGON : sessions_logged_on++; /* sprintf(buf,"Connections: %i",sessions_logged_on); SetDlgItemText(HWND_STATUS,IDC_CONNECTIONS_BORDER,buf); */ sprintf(buf,"%3i",sessions_logged_on); SendDlgItemMessage(hwndMain,IDS_STATUS_WINDOW,SB_SETTEXT,1,(LPARAM)buf); InterfaceAddList(lParam); break; case WM_BLAK_LOGOFF : sessions_logged_on--; if (sessions_logged_on < 0) eprintf("InterfaceWindowProc sessions_logged_on just went negative!\n"); /* sprintf(buf,"Connections: %i",sessions_logged_on); SetDlgItemText(HWND_STATUS,IDC_CONNECTIONS_BORDER,buf); */ sprintf(buf,"%3i",sessions_logged_on); SendDlgItemMessage(hwndMain,IDS_STATUS_WINDOW,SB_SETTEXT,1,(LPARAM)buf); InterfaceRemoveList(lParam); break; case WM_BLAK_UPDATE_SESSION : InterfaceUpdateList(lParam); break; case WM_BLAK_UPDATE_CHANNEL : InterfaceCheckChannels(); break; case WM_BLAK_UPDATE_ADMIN : InterfaceUpdateAdmin(); break; case WM_BLAK_SIGNAL_CONSOLE : if (PlaySound("signal",hInst,SND_RESOURCE | SND_ASYNC) == FALSE) { MessageBeep(MB_OK); break; } FlashWindow(hwnd,TRUE); Sleep(200); FlashWindow(hwnd,TRUE); break; case WM_BLAK_SOCKET_ACCEPT : AsyncSocketAccept(wParam,WSAGETSELECTEVENT(lParam),WSAGETSELECTERROR(lParam), SOCKET_PORT); break; case WM_BLAK_SOCKET_MAINTENANCE_ACCEPT : AsyncSocketAccept(wParam,WSAGETSELECTEVENT(lParam),WSAGETSELECTERROR(lParam), SOCKET_MAINTENANCE_PORT); break; case WM_BLAK_SMTP_SOCKET_ACCEPT : AsyncSMTPSocketAccept(wParam,WSAGETSELECTEVENT(lParam),WSAGETSELECTERROR(lParam)); break; case WM_BLAK_SOCKET_NAME_LOOKUP : AsyncNameLookup((HANDLE)wParam,WSAGETASYNCERROR(lParam)); break; case WM_BLAK_SOCKET_SELECT : AsyncSocketSelect(wParam,WSAGETSELECTEVENT(lParam),WSAGETSELECTERROR(lParam)); break; default : return DefWindowProc(hwnd,message,wParam,lParam); } return TRUE; }