From 5cc2e4b3f3aee7a0d528f3e125fdda8d27f5c580 Mon Sep 17 00:00:00 2001 From: Charlie Groves Date: Mon, 16 Jun 2008 06:21:52 +0000 Subject: [PATCH] Remove games from the ticker if their AI goes rogue so one game blowing up doesn't cause all games to stop ticking git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@627 c613c5cb-e716-0410-b11b-feb51c14d237 --- .../parlor/game/server/AIGameTicker.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/java/com/threerings/parlor/game/server/AIGameTicker.java b/src/java/com/threerings/parlor/game/server/AIGameTicker.java index eac302db..0299e105 100644 --- a/src/java/com/threerings/parlor/game/server/AIGameTicker.java +++ b/src/java/com/threerings/parlor/game/server/AIGameTicker.java @@ -21,8 +21,12 @@ package com.threerings.parlor.game.server; -import java.util.Iterator; +import static com.threerings.parlor.Log.log; import java.util.HashSet; +import java.util.List; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import com.samskivert.util.Interval; @@ -63,7 +67,7 @@ public class AIGameTicker extends Interval private AIGameTicker () { super(CrowdServer.omgr); - _games = new HashSet(); + _games = Sets.newHashSet(); schedule(TICK_FREQUENCY, true); } @@ -93,16 +97,30 @@ public class AIGameTicker extends Interval /** * Tick all the game AIs while on the dobj thread. */ + @Override public void expired () { - Iterator iter = _games.iterator(); - while (iter.hasNext()) { - ((GameManager) iter.next()).tickAIs(); + List busted = null; + for (GameManager game : _games) { + try { + game.tickAIs(); + } catch (Throwable t) { + log.warning("Game AI going rogue, removing from ticker", "game", game, t); + if (busted == null) { + busted = Lists.newArrayList(); + } + busted.add(game); + } + } + if (busted != null) { + for (GameManager game : busted) { + removeAIGame(game); + } } } /** Our set of ai games. */ - protected HashSet _games; + protected HashSet _games; /** Our single ticker for all AI games. */ protected static AIGameTicker _ticker;