Reimplement max_idle without a separate thread
Remove the KillIdle thread. Add timeout to struct iop, initialized in io_open(). Obey it in io_input() by passing it to empth_select(). If empth_select() times out, report that back through io_input() to recvclient() and player_login(). If player_login() receives a timeout indication, print a message and terminate the session. If recvclient() receives a timeout indication, flash a message to the player and initiate a shut down the player's session. Create WIN32 sys/time.h to define struct timeval. This creates some conflicts with WIN32 windows.h definitions. Including windows.h in show.c and info.c creates conflicts, so remove that. Modify service.c to include sys/socket.h instead of windows.h to remove the conflict with sys/time.h.
This commit is contained in:
parent
a7ee69d112
commit
08b9455682
17 changed files with 181 additions and 133 deletions
|
@ -560,12 +560,14 @@ empth_terminate(empth_t *pThread)
|
|||
*
|
||||
* This would be one of the main functions used within gen\io.c
|
||||
*/
|
||||
void
|
||||
empth_select(int fd, int flags)
|
||||
int
|
||||
empth_select(int fd, int flags, struct timeval *timeout)
|
||||
{
|
||||
int handle;
|
||||
WSAEVENT hEventObject[2];
|
||||
DWORD result, msec;
|
||||
empth_t *pThread = TlsGetValue(dwTLSIndex);
|
||||
int res;
|
||||
|
||||
loc_debug("%s select on %d",
|
||||
flags == EMPTH_FD_READ ? "read" : "write", fd);
|
||||
|
@ -586,13 +588,31 @@ empth_select(int fd, int flags)
|
|||
empth_exit();
|
||||
}
|
||||
|
||||
WSAWaitForMultipleEvents(2, hEventObject, FALSE, WSA_INFINITE, FALSE);
|
||||
if (timeout)
|
||||
msec = timeout->tv_sec * 1000L + timeout->tv_usec / 1000L;
|
||||
else
|
||||
msec = WSA_INFINITE;
|
||||
result = WSAWaitForMultipleEvents(2, hEventObject, FALSE, msec,
|
||||
FALSE);
|
||||
|
||||
switch (result) {
|
||||
case WSA_WAIT_TIMEOUT:
|
||||
res = 0;
|
||||
break;
|
||||
case WSA_WAIT_FAILED:
|
||||
errno = WSAGetLastError();
|
||||
res = -1;
|
||||
break;
|
||||
default:
|
||||
res = 1;
|
||||
}
|
||||
|
||||
WSAEventSelect(handle, hEventObject[0], 0);
|
||||
|
||||
WSACloseEvent(hEventObject[0]);
|
||||
|
||||
loc_RunThisThread(NULL);
|
||||
return res;
|
||||
}
|
||||
|
||||
/************************
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue