Example #1
0
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);
}
Example #2
0
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;
}