(player_kill_idle): Don't kill hung player threads. That code was

flawed.  Firstly, when player_kill_idle() ran before the player thread
could react to being aborted by update or shutdown, player_kill_idle()
incorrectly diagnosed it as hung.  Secondly, terminating hung threads
leaks resources and can leave a stale play_lock behind.  It could
perhaps even corrupt game state.  It might salvage some scenarios, but
makes others worse.  Not worth it.
This commit is contained in:
Markus Armbruster 2007-07-25 06:10:10 +00:00
parent d500a7071c
commit 043015e829
2 changed files with 4 additions and 15 deletions

View file

@ -51,29 +51,19 @@ player_kill_idle(void *unused)
while (1) {
empth_sleep(now + 60);
time(&now);
/*if (update_pending) */
/*continue; */
for (p = player_next(0); p != 0; p = player_next(p)) {
if (p->state == PS_SHUTDOWN) {
/* player thread hung */
/* FIXME but for how long? unknown if shut down elsewhere! */
/* FIXME this can leave stale update_lock behind! */
empth_terminate(p->proc);
p = player_delete(p);
/*
* Player thread hung or just aborted by update or
* shutdown, we can't tell.
*/
continue;
}
if (p->curup + max_idle * 60 < now) {
p->state = PS_SHUTDOWN;
/* giving control to another thread while
* in the middle of walking player list is
* not a good idea at all. Sasha */
p->aborted++;
pr_flash(p, "idle connection terminated\n");
empth_wakeup(p->proc);
/* go to sleep because player thread
could vandalize a player list */
break;
}
}
}

View file

@ -385,7 +385,6 @@ shutdwn(int sig)
empth_wakeup(p->proc);
}
empth_rwlock_wrlock(play_lock);
/* rely on player_kill_idle() for killing hung player threads */
if (sig)
logerror("Server shutting down on signal %d", sig);
else