Added proxy for EventListener to support multiple listeners

This commit is contained in:
Niclas Finne 2012-04-13 18:28:55 +02:00
parent 6ab9662686
commit 6c7ccde06d
4 changed files with 40 additions and 22 deletions

View File

@ -164,6 +164,7 @@ public class ProfilerCommands implements CommandBundle {
ch.registerCommand("logevents", new BasicAsyncCommand("log events", "[chips...]") { ch.registerCommand("logevents", new BasicAsyncCommand("log events", "[chips...]") {
Chip[] chips; Chip[] chips;
EventListener eventListener;
public int executeCommand(final CommandContext context) { public int executeCommand(final CommandContext context) {
if (context.getArgumentCount() == 0) { if (context.getArgumentCount() == 0) {
context.out.println("Available chips:"); context.out.println("Available chips:");
@ -187,19 +188,19 @@ public class ProfilerCommands implements CommandBundle {
return 1; return 1;
} }
} }
EventListener listener = new EventListener() { eventListener = new EventListener() {
public void event(EventSource source, String event, Object data) { public void event(EventSource source, String event, Object data) {
context.out.println("Event:" + source.getName() + ":" + event); context.out.println("Event:" + source.getName() + ":" + event);
} }
}; };
for (Chip chip : chips) { for (Chip chip : chips) {
chip.setEventListener(listener); chip.addEventListener(eventListener);
} }
return 0; return 0;
} }
public void stopCommand(CommandContext context) { public void stopCommand(CommandContext context) {
for (Chip chip : chips) { for (Chip chip : chips) {
chip.setEventListener(null); chip.removeEventListener(eventListener);
} }
} }
}); });

View File

@ -1,5 +1,5 @@
/** /**
* Copyright (c) 2007, Swedish Institute of Computer Science. * Copyright (c) 2007-2012, Swedish Institute of Computer Science.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -27,16 +27,12 @@
* *
* This file is part of MSPSim. * This file is part of MSPSim.
* *
* $Id$
*
* ----------------------------------------------------------------- * -----------------------------------------------------------------
* *
* Chip * Chip
* *
* Author : Joakim Eriksson * Author : Joakim Eriksson
* Created : 17 jan 2008 * Created : 17 jan 2008
* Updated : $Date$
* $Revision$
*/ */
package se.sics.mspsim.core; package se.sics.mspsim.core;
import java.io.PrintStream; import java.io.PrintStream;
@ -130,15 +126,20 @@ public abstract class Chip implements Loggable, EventSource {
modeNames = names; modeNames = names;
} }
public synchronized void addEventListener(EventListener listener) {
public void setEventListener(EventListener e) { eventListener = EventListener.Proxy.INSTANCE.add(eventListener, listener);
eventListener = e; sendEvents = eventListener != null;
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) { protected void sendEvent(String event, Object data) {
if (eventListener != null) { EventListener listener = this.eventListener;
eventListener.event(this, event, data); if (listener != null) {
listener.event(this, event, data);
} }
} }

View File

@ -1,5 +1,21 @@
package se.sics.mspsim.core; package se.sics.mspsim.core;
import se.sics.mspsim.util.ProxySupport;
public interface EventListener {
public void event(EventSource source, String event, Object data); public interface EventListener {
}
public void event(EventSource source, String event, Object data);
public static class Proxy extends ProxySupport<EventListener> 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);
}
}
}
}

View File

@ -520,8 +520,8 @@ public class SimpleProfiler implements Profiler, EventListener {
startTags.put(start, tagEntry); startTags.put(start, tagEntry);
endTags.put(end, tagEntry); endTags.put(end, tagEntry);
tagProfiles.put(tag, tagEntry); tagProfiles.put(tag, tagEntry);
chip.setEventListener(this); chip.addEventListener(this);
chip2.setEventListener(this); chip2.addEventListener(this);
} }
public void event(EventSource source, String event, Object data) { public void event(EventSource source, String event, Object data) {