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...]") {
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);
}
}
});

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.
*
* 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);
}
}

View File

@ -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<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);
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) {