From ab54db66b627a63e51bb5261effe58d41d514a33 Mon Sep 17 00:00:00 2001 From: Martin Oberhuber < martin.oberhuber@windriver.com> Date: Fri, 1 Feb 2008 13:03:19 +0000 Subject: [PATCH] [217429][api] Make registering multiple output listeners thread-safe --- .../shells/AbstractHostShellOutputReader.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/AbstractHostShellOutputReader.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/AbstractHostShellOutputReader.java index 1203cc4e58c..6b3e5d35948 100644 --- a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/AbstractHostShellOutputReader.java +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/AbstractHostShellOutputReader.java @@ -13,11 +13,13 @@ * * Contributors: * Martin Oberhuber (Wind River) - [197848] Fix shell terminated state when remote dies + * Martin Oberhuber (Wind River) - [217429] Make registering multiple output listeners thread-safe *******************************************************************************/ package org.eclipse.rse.services.shells; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public abstract class AbstractHostShellOutputReader extends Thread implements IHostShellOutputReader @@ -38,7 +40,7 @@ public abstract class AbstractHostShellOutputReader extends Thread implements I public AbstractHostShellOutputReader(IHostShell hostShell, boolean isErrorReader) { _hostShell = hostShell; - _listeners = new ArrayList(); + _listeners = Collections.synchronizedList(new ArrayList()); _linesOfOutput = new ArrayList(); _consumerOffset = 0; _isErrorReader = isErrorReader; @@ -102,12 +104,18 @@ public abstract class AbstractHostShellOutputReader extends Thread implements I } } + protected final synchronized void startIfNotAlive() { + if (!isAlive()) { + start(); + } + } + public IHostOutput readLine() { if (!isAlive()) { internalReadLine(); - start(); + startIfNotAlive(); } return (IHostOutput)_linesOfOutput.get(_consumerOffset++); } @@ -126,10 +134,7 @@ public abstract class AbstractHostShellOutputReader extends Thread implements I public void addOutputListener(IHostShellOutputListener listener) { _listeners.add(listener); - if (!isAlive()) - { - start(); - } + startIfNotAlive(); } public void fireOutputChanged(IHostShellChangeEvent event)