diff options
author | Henrik Rentz-Reichert | 2013-07-29 16:55:24 +0000 |
---|---|---|
committer | Henrik Rentz-Reichert | 2013-07-29 16:55:24 +0000 |
commit | 7e3829e1187d908b4682c07c30ccf27320956515 (patch) | |
tree | 7fbedf799075ea1834f61fb661a9c35a8dacd5af | |
parent | bbc95b8ac9fc075e4f1c66911f91f38238ebb5fc (diff) | |
download | org.eclipse.etrice-7e3829e1187d908b4682c07c30ccf27320956515.tar.gz org.eclipse.etrice-7e3829e1187d908b4682c07c30ccf27320956515.tar.xz org.eclipse.etrice-7e3829e1187d908b4682c07c30ccf27320956515.zip |
[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
9 files changed, 100 insertions, 94 deletions
diff --git a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.xtend b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.xtend index 85e0077e1..5c80eadad 100644 --- a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.xtend +++ b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.xtend @@ -77,23 +77,13 @@ class OptionalActorInterfaceGen extends GenericActorClassGenerator { «IF GlobalSettings::generateMSCInstrumentation» @Override - «IF replicated» - public int createOptionalActor(String actorClass, int thread) { - «ELSE» - public boolean createOptionalActor(String actorClass, int thread) { - «ENDIF» - DebuggingService.getInstance().addMessageActorCreate(this, actorClass); - return super.createOptionalActor(actorClass, thread); + protected void logCreation(String actorClass, String name) { + DebuggingService.getInstance().addMessageActorCreate(this, actorClass, name); } @Override - «IF replicated» - public boolean destroyOptionalActor(int idx) { - «ELSE» - public boolean destroyOptionalActor() { - «ENDIF» - DebuggingService.getInstance().addMessageActorDestroy(this); - return super.destroyOptionalActor(«IF replicated»idx«ENDIF»); + protected void logDeletion(String name) { + DebuggingService.getInstance().addMessageActorDestroy(this, name); } «ENDIF» } diff --git a/plugins/org.eclipse.etrice.generator.java/xtend-gen/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.java b/plugins/org.eclipse.etrice.generator.java/xtend-gen/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.java index 3c6e468fc..7da403008 100644 --- a/plugins/org.eclipse.etrice.generator.java/xtend-gen/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.java +++ b/plugins/org.eclipse.etrice.generator.java/xtend-gen/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.java @@ -186,24 +186,13 @@ public class OptionalActorInterfaceGen extends GenericActorClassGenerator { _builder.append("\t"); _builder.append("@Override"); _builder.newLine(); - { - if (replicated) { - _builder.append("\t"); - _builder.append("public int createOptionalActor(String actorClass, int thread) {"); - _builder.newLine(); - } else { - _builder.append("\t"); - _builder.append("public boolean createOptionalActor(String actorClass, int thread) {"); - _builder.newLine(); - } - } _builder.append("\t"); _builder.append("\t"); - _builder.append("DebuggingService.getInstance().addMessageActorCreate(this, actorClass);"); + _builder.append("protected void logCreation(String actorClass, String name) {"); _builder.newLine(); _builder.append("\t"); _builder.append("\t"); - _builder.append("return super.createOptionalActor(actorClass, thread);"); + _builder.append("DebuggingService.getInstance().addMessageActorCreate(this, actorClass, name);"); _builder.newLine(); _builder.append("\t"); _builder.append("}"); @@ -213,31 +202,14 @@ public class OptionalActorInterfaceGen extends GenericActorClassGenerator { _builder.append("\t"); _builder.append("@Override"); _builder.newLine(); - { - if (replicated) { - _builder.append("\t"); - _builder.append("public boolean destroyOptionalActor(int idx) {"); - _builder.newLine(); - } else { - _builder.append("\t"); - _builder.append("public boolean destroyOptionalActor() {"); - _builder.newLine(); - } - } _builder.append("\t"); _builder.append("\t"); - _builder.append("DebuggingService.getInstance().addMessageActorDestroy(this);"); + _builder.append("protected void logDeletion(String name) {"); _builder.newLine(); _builder.append("\t"); _builder.append("\t"); - _builder.append("return super.destroyOptionalActor("); - { - if (replicated) { - _builder.append("idx"); - } - } - _builder.append(");"); - _builder.newLineIfNotEmpty(); + _builder.append("DebuggingService.getInstance().addMessageActorDestroy(this, name);"); + _builder.newLine(); _builder.append("\t"); _builder.append("}"); _builder.newLine(); 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<String> 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); @@ -59,32 +62,42 @@ public class InterfaceItemBroker extends InterfaceItemBase implements IInterface } /* (non-Javadoc) + * @see org.eclipse.etrice.runtime.java.modelbase.InterfaceItemBase#connectWithPeer() + */ + protected void connectWithPeer() { + List<String> 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<String> paths = getPath2peers().get(path); if (paths!=null) { ArrayList<String> result = new ArrayList<String>(); 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<InterfaceItemBase> items = new ArrayList<InterfaceItemBase>(); private LinkedList<Integer> releasedIndices = new LinkedList<Integer>(); @@ -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<String> 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; |