From 6c7ccde06d232365ffa628d3097e49dad7640483 Mon Sep 17 00:00:00 2001 From: Niclas Finne Date: Fri, 13 Apr 2012 18:28:55 +0200 Subject: [PATCH] Added proxy for EventListener to support multiple listeners --- se/sics/mspsim/cli/ProfilerCommands.java | 7 ++++--- se/sics/mspsim/core/Chip.java | 25 ++++++++++++----------- se/sics/mspsim/core/EventListener.java | 26 +++++++++++++++++++----- se/sics/mspsim/util/SimpleProfiler.java | 4 ++-- 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/se/sics/mspsim/cli/ProfilerCommands.java b/se/sics/mspsim/cli/ProfilerCommands.java index 110b4b4..edd6f25 100644 --- a/se/sics/mspsim/cli/ProfilerCommands.java +++ b/se/sics/mspsim/cli/ProfilerCommands.java @@ -164,6 +164,7 @@ public class ProfilerCommands implements CommandBundle { ch.registerCommand("logevents", new BasicAsyncCommand("log events", "[chips...]") { Chip[] chips; + EventListener eventListener; public int executeCommand(final CommandContext context) { if (context.getArgumentCount() == 0) { context.out.println("Available chips:"); @@ -187,19 +188,19 @@ public class ProfilerCommands implements CommandBundle { return 1; } } - EventListener listener = new EventListener() { + eventListener = new EventListener() { public void event(EventSource source, String event, Object data) { context.out.println("Event:" + source.getName() + ":" + event); } }; for (Chip chip : chips) { - chip.setEventListener(listener); + chip.addEventListener(eventListener); } return 0; } public void stopCommand(CommandContext context) { for (Chip chip : chips) { - chip.setEventListener(null); + chip.removeEventListener(eventListener); } } }); diff --git a/se/sics/mspsim/core/Chip.java b/se/sics/mspsim/core/Chip.java index 250e78d..b22c7c9 100644 --- a/se/sics/mspsim/core/Chip.java +++ b/se/sics/mspsim/core/Chip.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2007, Swedish Institute of Computer Science. + * Copyright (c) 2007-2012, Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,16 +27,12 @@ * * This file is part of MSPSim. * - * $Id$ - * * ----------------------------------------------------------------- * * Chip * * Author : Joakim Eriksson * Created : 17 jan 2008 - * Updated : $Date$ - * $Revision$ */ package se.sics.mspsim.core; import java.io.PrintStream; @@ -130,15 +126,20 @@ public abstract class Chip implements Loggable, EventSource { modeNames = names; } - - public void setEventListener(EventListener e) { - eventListener = e; - sendEvents = eventListener != null; + public synchronized void addEventListener(EventListener listener) { + eventListener = EventListener.Proxy.INSTANCE.add(eventListener, listener); + sendEvents = eventListener != null; } - + + public synchronized void removeEventListener(EventListener listener) { + eventListener = EventListener.Proxy.INSTANCE.add(eventListener, listener); + sendEvents = eventListener != null; + } + protected void sendEvent(String event, Object data) { - if (eventListener != null) { - eventListener.event(this, event, data); + EventListener listener = this.eventListener; + if (listener != null) { + listener.event(this, event, data); } } diff --git a/se/sics/mspsim/core/EventListener.java b/se/sics/mspsim/core/EventListener.java index a6950a8..848bbc2 100644 --- a/se/sics/mspsim/core/EventListener.java +++ b/se/sics/mspsim/core/EventListener.java @@ -1,5 +1,21 @@ -package se.sics.mspsim.core; - -public interface EventListener { - public void event(EventSource source, String event, Object data); -} +package se.sics.mspsim.core; +import se.sics.mspsim.util.ProxySupport; + +public interface EventListener { + + public void event(EventSource source, String event, Object data); + + public static class Proxy extends ProxySupport implements EventListener { + public static final Proxy INSTANCE = new Proxy(); + + @Override + public void event(EventSource source, String event, Object data) { + EventListener[] listeners = this.listeners; + for(EventListener listener : listeners) { + listener.event(source, event, data); + } + } + + } + +} diff --git a/se/sics/mspsim/util/SimpleProfiler.java b/se/sics/mspsim/util/SimpleProfiler.java index 07e513b..e800913 100644 --- a/se/sics/mspsim/util/SimpleProfiler.java +++ b/se/sics/mspsim/util/SimpleProfiler.java @@ -520,8 +520,8 @@ public class SimpleProfiler implements Profiler, EventListener { startTags.put(start, tagEntry); endTags.put(end, tagEntry); tagProfiles.put(tag, tagEntry); - chip.setEventListener(this); - chip2.setEventListener(this); + chip.addEventListener(this); + chip2.addEventListener(this); } public void event(EventSource source, String event, Object data) {