Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rentz-Reichert2013-07-29 12:55:24 -0400
committerHenrik Rentz-Reichert2013-07-29 12:55:24 -0400
commit7e3829e1187d908b4682c07c30ccf27320956515 (patch)
tree7fbedf799075ea1834f61fb661a9c35a8dacd5af
parentbbc95b8ac9fc075e4f1c66911f91f38238ebb5fc (diff)
downloadorg.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
-rw-r--r--plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.xtend18
-rw-r--r--plugins/org.eclipse.etrice.generator.java/xtend-gen/org/eclipse/etrice/generator/java/gen/OptionalActorInterfaceGen.java38
-rw-r--r--runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/debugging/DebuggingService.java28
-rw-r--r--runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBase.java16
-rw-r--r--runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/InterfaceItemBroker.java37
-rw-r--r--runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/OptionalActorInterfaceBase.java26
-rw-r--r--runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedInterfaceItemBase.java9
-rw-r--r--runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ReplicatedOptionalActorInterfaceBase.java19
-rw-r--r--runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ScalarOptionalActorInterfaceBase.java3
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;

Back to the top