From 6392f63296720327bd5c9deeca20918b12d2d3f3 Mon Sep 17 00:00:00 2001 From: Martin Oberhuber < martin.oberhuber@windriver.com> Date: Tue, 12 Feb 2008 17:53:07 +0000 Subject: [PATCH] [218659] Make *EventManager, *ChangeManager thread-safe --- .../model/SystemModelChangeEventManager.java | 49 +++++--- .../model/SystemPreferenceChangeManager.java | 47 +++++--- .../model/SystemRemoteChangeEventManager.java | 65 ++++++++--- .../model/SystemResourceChangeManager.java | 105 +++++++++++------- 4 files changed, 179 insertions(+), 87 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemModelChangeEventManager.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemModelChangeEventManager.java index a827202af83..bca94c07f89 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemModelChangeEventManager.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemModelChangeEventManager.java @@ -1,5 +1,5 @@ /******************************************************************************** - * Copyright (c) 2002, 2007 IBM Corporation and others. All rights reserved. + * Copyright (c) 2002, 2008 IBM Corporation and others. All rights reserved. * This program and the accompanying materials are made available under the terms * of the Eclipse Public License v1.0 which accompanies this distribution, and is * available at http://www.eclipse.org/legal/epl-v10.html @@ -12,10 +12,12 @@ * * Contributors: * Martin Oberhuber (Wind River) - [168975] Move RSE Events API to Core + * Martin Oberhuber (Wind River) - [218659] Make *EventManager, *ChangeManager thread-safe ********************************************************************************/ package org.eclipse.rse.internal.core.model; -import java.util.Vector; +import java.util.ArrayList; +import java.util.List; import org.eclipse.rse.core.events.ISystemModelChangeEvent; import org.eclipse.rse.core.events.ISystemModelChangeListener; @@ -26,7 +28,8 @@ import org.eclipse.rse.core.events.ISystemModelChangeListener; */ public class SystemModelChangeEventManager { - private Vector listeners = new Vector(); + private List listeners = new ArrayList(); + private Object lockObject = new Object(); /** * Constructor @@ -36,34 +39,48 @@ public class SystemModelChangeEventManager } /** - * Add a listener to list of listeners. If this object is already in - * the list, this does nothing. + * Add a listener to list of listeners. + * If this object is already in the list, this does nothing. + * @param l the listener to add */ public void addSystemModelChangeListener(ISystemModelChangeListener l) { - if (!listeners.contains(l)) - listeners.addElement(l); + synchronized(lockObject) { + if (!listeners.contains(l)) + listeners.add(l); + } } /** - * Remove a listener to list of listeners. If this object is not in - * the list, this does nothing. + * Remove a listener from the list of listeners. + * If this object is not in the list, this does nothing. + * @param l the listener to remove */ public void removeSystemModelChangeListener(ISystemModelChangeListener l) { - if (listeners.contains(l)) - listeners.removeElement(l); + synchronized(lockObject) { + //Thread-safety: create a new List when removing, to avoid problems in notify() + listeners = new ArrayList(listeners); + listeners.remove(l); + } } /** - * Notify all registered listeners of the given event + * Notify all registered listeners of the given event. + * @param event the event to send */ public void notify(ISystemModelChangeEvent event) { - for (int idx=0; idxtrue if the listener is already registered */ public boolean isRegisteredSystemRemoteChangeListener(ISystemRemoteChangeListener l) { - return listeners.contains(l); + synchronized(lockObject) { + for(int i=0; itrue if the listener is already registered */ public boolean isRegisteredSystemResourceChangeListener(ISystemResourceChangeListener l) { - return listeners.contains(l); - } - - /** - * Notify all registered listeners of the given event - */ - public void notify(ISystemResourceChangeEvent event) - { - for (int idx=0; idx