From ddfaebd48780704a9ea7edd4806d7b3619210448 Mon Sep 17 00:00:00 2001 From: Devrandom Date: Wed, 27 Aug 2014 19:20:12 -0700 Subject: [PATCH] Orchid: narrower locking --- .../orchid/circuits/CircuitManagerImpl.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/orchid/src/com/subgraph/orchid/circuits/CircuitManagerImpl.java b/orchid/src/com/subgraph/orchid/circuits/CircuitManagerImpl.java index 17ca56d5..9b68cd0b 100644 --- a/orchid/src/com/subgraph/orchid/circuits/CircuitManagerImpl.java +++ b/orchid/src/com/subgraph/orchid/circuits/CircuitManagerImpl.java @@ -104,15 +104,19 @@ public class CircuitManagerImpl implements CircuitManager, DashboardRenderable { try { isBuilding = false; scheduledExecutor.shutdownNow(); - if (killCircuits) { - List circuits = new ArrayList(activeCircuits); - for (CircuitImpl c : circuits) { - c.destroyCircuit(); - } - } } finally { lock.unlock(); } + + if (killCircuits) { + ArrayList circuits; + synchronized (activeCircuits) { + circuits = new ArrayList(activeCircuits); + } + for (CircuitImpl c : circuits) { + c.destroyCircuit(); + } + } } public ExitCircuit createNewExitCircuit(Router exitRouter) { @@ -125,15 +129,18 @@ public class CircuitManagerImpl implements CircuitManager, DashboardRenderable { activeCircuits.notifyAll(); } + boolean doDestroy; lock.lock(); try { - if (!isBuilding) { - // we were asked to stop since this circuit was started - circuit.destroyCircuit(); - } + doDestroy = !isBuilding; } finally { lock.unlock(); } + + if (doDestroy) { + // we were asked to stop since this circuit was started + circuit.destroyCircuit(); + } } void removeActiveCircuit(CircuitImpl circuit) {