]> git.pond.sub.org Git - empserver/commitdiff
(player_kill_idle): Don't kill hung player threads. That code was
authorMarkus Armbruster <armbru@pond.sub.org>
Wed, 25 Jul 2007 06:10:10 +0000 (06:10 +0000)
committerMarkus Armbruster <armbru@pond.sub.org>
Wed, 25 Jul 2007 06:10:10 +0000 (06:10 +0000)
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.

src/server/idle.c
src/server/main.c

index d291b2655f4196695b1fcd6e97b7ca30bd173fcf..873261f34af43bdd7abd8634a9ac5981a903b611 100644 (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;
            }
        }
     }
index 1141008cf1150815d863cd1bd92e4c85bbf4820a..5e7c2054295db88b878820a99a33b2b0c16c34e6 100644 (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