X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fnet%2Fsf%2Fopenrocket%2Flogging%2FDelegatorLogger.java;h=45ff9e55b963fa0699d920e8c4dd121eeac2a103;hb=f8aca85893990faf46d59ab89e9861f46c66dff3;hp=10a8daa7ec22b74eb9ddb05ca408e6321f4721e0;hpb=6d71a8c4a93455ea8d3df1ed42d33b941847efcc;p=debian%2Fopenrocket diff --git a/src/net/sf/openrocket/logging/DelegatorLogger.java b/src/net/sf/openrocket/logging/DelegatorLogger.java index 10a8daa7..45ff9e55 100644 --- a/src/net/sf/openrocket/logging/DelegatorLogger.java +++ b/src/net/sf/openrocket/logging/DelegatorLogger.java @@ -12,23 +12,42 @@ import java.util.List; */ public class DelegatorLogger extends LogHelper { - private List loggers = new ArrayList(); + /** + * List of loggers. This list must not be modified, instead it should be + * replaced every time the list is changed. + */ + private volatile ArrayList loggers = new ArrayList(); @Override public void log(LogLine line) { - LogHelper[] array = loggers.toArray(new LogHelper[0]); - for (LogHelper l: array) { + // Must create local reference for thread safety + List list = loggers; + for (LogHelper l: list) { l.log(line); } } - public void addLogger(LogHelper logger) { - this.loggers.add(logger); + /** + * Add a logger from the delegation list. + * @param logger the logger to add. + */ + @SuppressWarnings("unchecked") + public synchronized void addLogger(LogHelper logger) { + ArrayList newList = (ArrayList) loggers.clone(); + newList.add(logger); + this.loggers = newList; } - public void removeLogger(LogHelper logger) { - this.loggers.remove(logger); + /** + * Remove a logger from the delegation list. + * @param logger the logger to be removed. + */ + @SuppressWarnings("unchecked") + public synchronized void removeLogger(LogHelper logger) { + ArrayList newList = (ArrayList) loggers.clone(); + newList.remove(logger); + this.loggers = newList; } }