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
|
@ -72,14 +72,18 @@ struct player *
|
|||
player_new(int s)
|
||||
{
|
||||
struct player *lp;
|
||||
struct timeval idle_timeout;
|
||||
|
||||
lp = malloc(sizeof(struct player));
|
||||
if (!lp)
|
||||
return NULL;
|
||||
memset(lp, 0, sizeof(struct player));
|
||||
idle_timeout.tv_sec = max_idle * 60;
|
||||
idle_timeout.tv_usec = 0 ;
|
||||
if (s >= 0) {
|
||||
/* real player, not dummy created by update and market update */
|
||||
lp->iop = io_open(s, IO_READ | IO_WRITE | IO_NBLOCK, IO_BUFSIZE);
|
||||
lp->iop = io_open(s, IO_READ | IO_WRITE | IO_NBLOCK, IO_BUFSIZE,
|
||||
idle_timeout);
|
||||
if (!lp->iop) {
|
||||
free(lp);
|
||||
return NULL;
|
||||
|
@ -173,7 +177,7 @@ player_accept(void *unused)
|
|||
sap = malloc(player_addrlen);
|
||||
|
||||
while (1) {
|
||||
empth_select(s, EMPTH_FD_READ);
|
||||
empth_select(s, EMPTH_FD_READ, NULL);
|
||||
len = player_addrlen;
|
||||
ns = accept(s, sap, &len);
|
||||
/* FIXME accept() can block on some systems (RST after select() reports ready) */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue