From 7e3829e1187d908b4682c07c30ccf27320956515 Mon Sep 17 00:00:00 2001 From: Henrik Rentz-Reichert Date: Mon, 29 Jul 2013 18:55:24 +0200 Subject: [runtime.java][generator.java] bug 413297: [runtime.java][generator.java] Let Java generator and runtime support dynamic actors https://bugs.eclipse.org/bugs/show_bug.cgi?id=413297 fixed bugs for replicated dynamic actors, dynamicactorexample3 running--- .../runtime/java/debugging/DebuggingService.java | 28 ++++++++++------ .../runtime/java/modelbase/InterfaceItemBase.java | 16 +++++++--- .../java/modelbase/InterfaceItemBroker.java | 37 +++++++++++++++------- .../java/modelbase/OptionalActorInterfaceBase.java | 26 ++++++++++++--- .../modelbase/ReplicatedInterfaceItemBase.java | 9 +++++- .../ReplicatedOptionalActorInterfaceBase.java | 19 +++-------- .../ScalarOptionalActorInterfaceBase.java | 3 ++ 7 files changed, 91 insertions(+), 47 deletions(-) (limited to 'runtime/org.eclipse.etrice.runtime.java/src') diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/debugging/DebuggingService.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/debugging/DebuggingService.java index 4a9f52f8f..ce6705bd7 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/debugging/DebuggingService.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/debugging/DebuggingService.java @@ -57,12 +57,16 @@ public class DebuggingService { } public void addMessageAsyncOut(Address source, Address target, String msg){ - if (source!=null && target!=null) - asyncLogger.addMessageAsyncOut(portInstances.get(source).getActor().getInstancePath(), portInstances.get(target).getActor().getInstancePath(), msg); + PortBase srcPort = portInstances.get(source); + PortBase tgtPort = portInstances.get(target); + if (srcPort!=null && tgtPort!=null) + asyncLogger.addMessageAsyncOut(srcPort.getActor().getInstancePath(), tgtPort.getActor().getInstancePath(), msg); } public void addMessageAsyncIn(Address source, Address target, String msg){ + PortBase srcPort = portInstances.get(source); + PortBase tgtPort = portInstances.get(target); if (source!=null && target!=null) - asyncLogger.addMessageAsyncIn(portInstances.get(source).getActor().getInstancePath(), portInstances.get(target).getActor().getInstancePath(), msg); + asyncLogger.addMessageAsyncIn(srcPort.getActor().getInstancePath(), tgtPort.getActor().getInstancePath(), msg); // TODO: this was only a quickfix to trace unconnected ports // if (source==null) @@ -72,10 +76,16 @@ public class DebuggingService { } public void addMessageSyncCall(Address source, Address target, String msg){ - asyncLogger.addMessageSyncCall(portInstances.get(source).getActor().getInstancePath(), portInstances.get(target).getActor().getInstancePath(), msg); + PortBase srcPort = portInstances.get(source); + PortBase tgtPort = portInstances.get(target); + if (srcPort!=null && tgtPort!=null) + asyncLogger.addMessageSyncCall(srcPort.getActor().getInstancePath(), tgtPort.getActor().getInstancePath(), msg); } public void addMessageSyncReturn(Address source, Address target, String msg){ - asyncLogger.addMessageSyncReturn(portInstances.get(source).getActor().getInstancePath(), portInstances.get(target).getActor().getInstancePath(), msg); + PortBase srcPort = portInstances.get(source); + PortBase tgtPort = portInstances.get(target); + if (srcPort!=null && tgtPort!=null) + asyncLogger.addMessageSyncReturn(srcPort.getActor().getInstancePath(), tgtPort.getActor().getInstancePath(), msg); } public void addActorState(ActorClassBase actor, String state){ @@ -95,13 +105,13 @@ public class DebuggingService { asyncLogger.addMessageActorDestroy(inst.getParent().getInstancePath(), inst.getInstancePath()); } - public void addMessageActorCreate(OptionalActorInterfaceBase oai, String actorClass) { + public void addMessageActorCreate(OptionalActorInterfaceBase oai, String actorClass, String name) { asyncLogger.addNote(oai.getParent().getInstancePath(), "dynamically creating actor class "+actorClass); - asyncLogger.addMessageActorCreate(oai.getParent().getInstancePath(), oai.getInstancePath()+IRTObject.PATH_DELIM+oai.getName()); + asyncLogger.addMessageActorCreate(oai.getParent().getInstancePath(), oai.getInstancePath()+IRTObject.PATH_DELIM+name); } - public void addMessageActorDestroy(OptionalActorInterfaceBase oai) { - asyncLogger.addMessageActorDestroy(oai.getParent().getInstancePath(), oai.getInstancePath()+IRTObject.PATH_DELIM+oai.getName()); + public void addMessageActorDestroy(OptionalActorInterfaceBase oai, String name) { + asyncLogger.addMessageActorDestroy(oai.getParent().getInstancePath(), oai.getInstancePath()+IRTObject.PATH_DELIM+name); } public void addVisibleComment(String comment) { diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBase.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBase.java index 9b70125aa..7489de7ff 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBase.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBase.java @@ -74,6 +74,10 @@ public abstract class InterfaceItemBase extends AbstractMessageReceiver { } } + connectWithPeer(); + } + + protected void connectWithPeer() { List peerPaths = getParent().getPeersForPath(getInstancePath()); if (peerPaths!=null && !peerPaths.isEmpty()) { IRTObject object = getObject(peerPaths.get(0)); @@ -86,16 +90,15 @@ public abstract class InterfaceItemBase extends AbstractMessageReceiver { } connectWith(peer); } - } - protected synchronized void connectWith(InterfaceItemBase peer) { + protected synchronized InterfaceItemBase connectWith(InterfaceItemBase peer) { if (peer!=null) { this.peer = peer; if (peer instanceof IInterfaceItemBroker) { - peer.connectWith(this); - return; + this.peer = peer.connectWith(this); + return this.peer; } // connect with each other @@ -103,7 +106,10 @@ public abstract class InterfaceItemBase extends AbstractMessageReceiver { peer.peerAddress = getAddress(); this.peerMsgReceiver = peer.ownMsgReceiver; peer.peerMsgReceiver = ownMsgReceiver; + } + + return peer; } protected synchronized void disconnect() { @@ -174,6 +180,6 @@ public abstract class InterfaceItemBase extends AbstractMessageReceiver { @Override public String toString() { - return "port "+getName()+" "+getAddress()+" <-> "+getPeerAddress(); + return ((replicator!=null)?"sub ":"")+"port "+getName()+" "+getAddress()+" <-> "+getPeerAddress(); } } diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBroker.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBroker.java index ae2771a14..0d27a165a 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBroker.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBroker.java @@ -12,6 +12,9 @@ package org.eclipse.etrice.runtime.java.modelbase; +import java.util.List; + +import org.eclipse.etrice.runtime.java.messaging.IRTObject; import org.eclipse.etrice.runtime.java.messaging.Message; /** @@ -34,7 +37,7 @@ import org.eclipse.etrice.runtime.java.messaging.Message; */ public class InterfaceItemBroker extends InterfaceItemBase implements IInterfaceItemBroker { - private InterfaceItemBase firstPeer; + private IRTObject firstPeer; public InterfaceItemBroker(IInterfaceItemOwner parent, String name, int localId) { this(parent, name, localId, 0); @@ -58,33 +61,43 @@ public class InterfaceItemBroker extends InterfaceItemBase implements IInterface // ignore this, will never receive a message } + /* (non-Javadoc) + * @see org.eclipse.etrice.runtime.java.modelbase.InterfaceItemBase#connectWithPeer() + */ + protected void connectWithPeer() { + List peerPaths = getParent().getPeersForPath(getInstancePath()); + if (peerPaths!=null && !peerPaths.isEmpty()) { + firstPeer = getObject(peerPaths.get(0)); + } + } + /* (non-Javadoc) * @see org.eclipse.etrice.runtime.java.modelbase.InterfaceItemBase#connectWith(org.eclipse.etrice.runtime.java.modelbase.InterfaceItemBase) */ @Override - public void connectWith(InterfaceItemBase peer) { - if (firstPeer==null) { - firstPeer = peer; - super.connectWith(peer); - } - else { + public InterfaceItemBase connectWith(InterfaceItemBase peer) { + if (firstPeer!=null) { // we are already connected, lets connect our new peer with the previous one - InterfaceItemBase peer1 = firstPeer; + InterfaceItemBase peer1 = null; InterfaceItemBase peer2 = peer; // get a new replicated sub port if appropriate - if (peer1 instanceof IReplicatedInterfaceItem) { - peer1 = ((IReplicatedInterfaceItem) peer1).createSubInterfaceItem(); + if (firstPeer instanceof IReplicatedInterfaceItem) { + peer1 = ((IReplicatedInterfaceItem) firstPeer).createSubInterfaceItem(); } - if (peer2 instanceof IReplicatedInterfaceItem) { - peer2 = ((IReplicatedInterfaceItem) peer2).createSubInterfaceItem(); + else if (firstPeer instanceof InterfaceItemBase) { + peer1 = (InterfaceItemBase) firstPeer; } peer2.peerAddress = peer1.getAddress(); peer2.peerMsgReceiver = peer1.ownMsgReceiver; peer1.peerAddress = peer2.getAddress(); peer1.peerMsgReceiver = peer2.ownMsgReceiver; + + return peer1; } + + return null; } } diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/OptionalActorInterfaceBase.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/OptionalActorInterfaceBase.java index 8072c0a1f..b08123abb 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/OptionalActorInterfaceBase.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/OptionalActorInterfaceBase.java @@ -56,16 +56,24 @@ public abstract class OptionalActorInterfaceBase extends SystemPortOwner impleme if (getPath2peers()==null) return getParent().getPeersForPath(path); - path = path.substring(getOwnPath().length()+getName().length()+1); -// if (path.indexOf('/', 1)>=0) -// path = path.substring(getName().length()+1); + // remove own path + + int sep = path.indexOf(PATH_DELIM, getOwnPath().length()+1); + if (sep<0 || sep>=path.length()) + return null; + + String optInstPath = path.substring(0, sep); + path = path.substring(sep); + ArrayList paths = getPath2peers().get(path); if (paths!=null) { ArrayList result = new ArrayList(); for (String p : paths) { if (p.indexOf('/', 1)>=0) - p = IRTObject.PATH_DELIM+getName()+IRTObject.PATH_DELIM+getName()+p; - p = getOwnPath()+p; + // it's a path nested in the optional instance + p = optInstPath+p; + else + // its a path to one of my brokers + p = getOwnPath()+p; result.add(p); } return result; @@ -132,4 +140,12 @@ public abstract class OptionalActorInterfaceBase extends SystemPortOwner impleme public IReplicatedInterfaceItem getSystemPort() { return RTSystemPort; } + + protected void logCreation(String actorClass, String name) { + // empty implementation, may be overridden by sub class + } + + protected void logDeletion(String name) { + // empty implementation, may be overridden by sub class + } } diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedInterfaceItemBase.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedInterfaceItemBase.java index 0e631647d..f6a92fe6b 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedInterfaceItemBase.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedInterfaceItemBase.java @@ -25,6 +25,8 @@ import org.eclipse.etrice.runtime.java.messaging.RTObject; */ public abstract class ReplicatedInterfaceItemBase extends RTObject implements IReplicatedInterfaceItem, IInterfaceItemOwner { + public static final char SEP = ':'; + private int localId; private ArrayList items = new ArrayList(); private LinkedList releasedIndices = new LinkedList(); @@ -63,7 +65,7 @@ public abstract class ReplicatedInterfaceItemBase extends RTObject implements IR */ @Override public InterfaceItemBase createSubInterfaceItem() { - InterfaceItemBase item = createInterfaceItem(this, getName()+items.size(), localId, getFreeIndex()); + InterfaceItemBase item = createInterfaceItem(this, getName()+SEP+items.size(), localId, getFreeIndex()); items.add(item); return item; } @@ -112,5 +114,10 @@ public abstract class ReplicatedInterfaceItemBase extends RTObject implements IR return items; } + @Override + public String toString() { + return "replicated port "+getName(); + } + protected abstract InterfaceItemBase createInterfaceItem(IInterfaceItemOwner rcv, String name, int lid, int idx); } diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedOptionalActorInterfaceBase.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedOptionalActorInterfaceBase.java index 828a336c8..af2211bcd 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedOptionalActorInterfaceBase.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedOptionalActorInterfaceBase.java @@ -14,7 +14,6 @@ package org.eclipse.etrice.runtime.java.modelbase; import java.util.ArrayList; import java.util.LinkedList; -import java.util.List; import org.eclipse.etrice.runtime.java.messaging.IRTObject; import org.eclipse.etrice.runtime.java.messaging.RTServices; @@ -51,6 +50,7 @@ public class ReplicatedOptionalActorInterfaceBase extends OptionalActorInterface // the factory will set our path2peers map int index = getFreeIndex(); String name = getChildName(index); + logCreation(actorClass, name); ActorClassBase actor = factory.create(this, name); if (actor==null) return -1; @@ -67,7 +67,9 @@ public class ReplicatedOptionalActorInterfaceBase extends OptionalActorInterface * @return */ public boolean destroyOptionalActor(int idx) { - IRTObject child = getChild(getChildName(idx)); + String childName = getChildName(idx); + logDeletion(childName); + IRTObject child = getChild(childName); if (!(child instanceof ActorClassBase)) return false; @@ -87,19 +89,6 @@ public class ReplicatedOptionalActorInterfaceBase extends OptionalActorInterface actors.clear(); } - /* (non-Javadoc) - * @see org.eclipse.etrice.runtime.java.modelbase.OptionalActorInterfaceBase#getPeersForPath(java.lang.String) - */ - @Override - public List getPeersForPath(String path) { -// if (getPath2peers()==null) -// return null; -// -// path = path.substring(getOwnPath().length(), path.lastIndexOf(INDEX_SEP)); -// return getPath2peers().get(path); - return super.getPeersForPath(path); - } - public String getChildName(int idx) { return getName()+INDEX_SEP+idx; } diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ScalarOptionalActorInterfaceBase.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ScalarOptionalActorInterfaceBase.java index 325780159..0f412ed6b 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ScalarOptionalActorInterfaceBase.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ScalarOptionalActorInterfaceBase.java @@ -46,6 +46,7 @@ public class ScalarOptionalActorInterfaceBase extends OptionalActorInterfaceBase return false; // the factory will set our path2peers map + logCreation(actorClass, getName()); actor = factory.create(this, getName()); startSubTree(); @@ -61,6 +62,8 @@ public class ScalarOptionalActorInterfaceBase extends OptionalActorInterfaceBase if (actor==null) return false; + logDeletion(getName()); + actor.destroy(); actor = null; -- cgit v1.2.3