From c5e939ebca6576a089a4d3c8101f61fd7553371c Mon Sep 17 00:00:00 2001 From: Henrik Rentz-Reichert Date: Wed, 23 Feb 2011 23:10:45 +0100 Subject: applied patch 2 of https://bugs.eclipse.org/bugs/show_bug.cgi?id=337075 Thanks for the contribution!--- .../runtime/java/messaging/MessageDispatcher.java | 4 +- .../runtime/java/messaging/MessageService.java | 4 +- .../java/messaging/MessageServiceController.java | 192 +++++++++++---------- .../etrice/runtime/java/messaging/RTServices.java | 84 ++++----- .../runtime/java/modelbase/ActorClassBase.java | 12 +- .../runtime/java/modelbase/InterfaceItemBase.java | 24 ++- .../etrice/runtime/java/modelbase/PortBase.java | 4 +- .../runtime/java/modelbase/SubSystemClassBase.java | 18 +- 8 files changed, 184 insertions(+), 158 deletions(-) (limited to 'runtime/org.eclipse.etrice.runtime.java/src/org') diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageDispatcher.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageDispatcher.java index ab3ec7c26..5ba4115cf 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageDispatcher.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageDispatcher.java @@ -38,7 +38,7 @@ public class MessageDispatcher extends RTObject implements IMessageReceiver { node_map.put(receiver.getAddress().objectID, receiver); } else if(receiver.getAddress().threadID != address.threadID){ - thread_map.put(receiver.getAddress().objectID, receiver); + thread_map.put(receiver.getAddress().threadID, receiver); } else { local_map.put(receiver.getAddress().objectID, receiver); @@ -53,7 +53,7 @@ public class MessageDispatcher extends RTObject implements IMessageReceiver { receiver = node_map.get(msg.getAddress().objectID); } else if(msg.getAddress().threadID != address.threadID){ - receiver = thread_map.get(msg.getAddress().objectID); + receiver = thread_map.get(msg.getAddress().threadID); } else { // Same node, same thread -> local call Dispatch Map diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageService.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageService.java index f709f3d87..a12463a3c 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageService.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageService.java @@ -38,8 +38,7 @@ public class MessageService extends Thread implements IMessageReceiver, this.parent = parent; address = addr; this.name = name; - messageDispatcher = new MessageDispatcher(this, new Address(addr.nodeID, - addr.threadID, addr.objectID + 1), "Dispatcher"); + messageDispatcher = new MessageDispatcher(this, new Address(addr.nodeID,addr.threadID, addr.objectID + 1), "Dispatcher"); messageQueue = new MessageSeQueue(this, "Queue"); } @@ -75,6 +74,7 @@ public class MessageService extends Thread implements IMessageReceiver, } else { lastMessageTimestamp = System.currentTimeMillis(); + //System.out.printf("%i. msgServ %i addr.Thread \n",address.threadID,msg.getAddress().threadID); messageDispatcher.receive(msg); } diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageServiceController.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageServiceController.java index f941cadee..20986d0ba 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageServiceController.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageServiceController.java @@ -1,90 +1,102 @@ -/******************************************************************************* - * Copyright (c) 2011 protos software gmbh (http://www.protos.de). - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * CONTRIBUTORS: - * Thomas Schuetz - * - *******************************************************************************/ - -package org.eclipse.etrice.runtime.java.messaging; - -import java.util.ArrayList; -import java.util.List; - -/** - * The MessageServiceController controls lifecycle of and access to all MessageServices in one SubSystem - * - * @author Thomas Schuetz - * - */ - -public class MessageServiceController { - - public MessageServiceController(/*IRTObject parent*/){ - // TODOTS: Who is parent of MessageServices and Controller? - // this.parent = parent; - messageServiceList = new ArrayList(); - } - - public void addMsgSrv(MessageService msgSrv){ - // TODOTS: Who is parent of MessageServices ? - assert(msgSrv.getAddress().threadID == messageServiceList.size()); - messageServiceList.add(msgSrv); - } - - public MessageService getMessageService(int threadID){ - assert(threadID < messageServiceList.size()); - return messageServiceList.get(threadID); - } - - - - public void start() { - // start all message services - for (MessageService msgSrv : messageServiceList){ - msgSrv.start(); - // TODOTS: start in order of priorities - } - running = true; - } - - public void stop() { - terminate(); - waitTerminate(); - } - - private void terminate() { - if (!running){ - return; - } - running = false; - - // terminate all message services - for (MessageService msgSrv : messageServiceList){ - msgSrv.terminate(); - // TODOTS: stop in order of priorities - } - } - - /** - * waitTerminate waits blocking for all MessageServices to terminate - * ! not threadsafe ! - */ - public void waitTerminate() { - for (MessageService msgSrv : messageServiceList){ - try { - msgSrv.join(); - } - catch (InterruptedException e1) { - } - } - } - - private List messageServiceList = null; -// private IRTObject parent = null; - private boolean running = false; -} +/******************************************************************************* + * Copyright (c) 2011 protos software gmbh (http://www.protos.de). + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * CONTRIBUTORS: + * Thomas Schuetz + * + *******************************************************************************/ + +package org.eclipse.etrice.runtime.java.messaging; + +import java.util.ArrayList; +import java.util.List; + +/** + * The MessageServiceController controls lifecycle of and access to all MessageServices in one SubSystem + * + * @author Thomas Schuetz + * + */ + +public class MessageServiceController { + + public MessageServiceController(/*IRTObject parent*/){ + // TODOTS: Who is parent of MessageServices and Controller? + // this.parent = parent; + messageServiceList = new ArrayList(); + } + + public void addMsgSvc(MessageService msgSvc){ + // TODOTS: Who is parent of MessageServices ? + assert(msgSvc.getAddress().threadID == messageServiceList.size()); + messageServiceList.add(msgSvc); + } + + public MessageService getMsgSvc(int threadID){ + assert(threadID < messageServiceList.size()); + return messageServiceList.get(threadID); + } + + //the connectAll method connects all messageServices + //it is included for test purposes + //currently it is not called + public void connectAll(){ + for (int i=0; i < messageServiceList.size(); i++){ + MessageDispatcher dispatcher = getMsgSvc(i).getMessageDispatcher(); + for (int j=0;j < messageServiceList.size();j++){ + if(i!=j){ + dispatcher.addMessageReceiver(RTServices.getInstance().getMsgSvcCtrl().getMsgSvc(j)); + } + } + } + } + + public void start() { + // start all message services + for (MessageService msgSvc : messageServiceList){ + msgSvc.start(); + // TODOTS: start in order of priorities + } + running = true; + } + + public void stop() { + terminate(); + waitTerminate(); + } + + private void terminate() { + if (!running){ + return; + } + running = false; + + // terminate all message services + for (MessageService msgSvc : messageServiceList){ + msgSvc.terminate(); + // TODOTS: stop in order of priorities + } + } + + /** + * waitTerminate waits blocking for all MessageServices to terminate + * ! not threadsafe ! + */ + public void waitTerminate() { + for (MessageService msgSvc : messageServiceList){ + try { + msgSvc.join(); + } + catch (InterruptedException e1) { + } + } + } + + private List messageServiceList = null; +// private IRTObject parent = null; + private boolean running = false; +} diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/RTServices.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/RTServices.java index b029c7257..910aaf1e7 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/RTServices.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/RTServices.java @@ -1,42 +1,42 @@ -/******************************************************************************* - * Copyright (c) 2011 protos software gmbh (http://www.protos.de). - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * CONTRIBUTORS: - * Thomas Schuetz - * - *******************************************************************************/ - -package org.eclipse.etrice.runtime.java.messaging; - -/** - * RTServices is the single point of access to all runtime services in one SubSystem - * e.g. MessageServices, DebuggingService, ... - * - * @author Thomas Schuetz - * - */ -public class RTServices { - - private RTServices(){ - messageServiceController = new MessageServiceController(); - } - - public static RTServices getInstance(){ - if (instance == null){ - instance = new RTServices(); - } - return instance; - } - - public MessageServiceController getMsgSrvCtrl(){ - assert(messageServiceController != null); - return messageServiceController; - } - - private static RTServices instance = null; - private MessageServiceController messageServiceController = null; -} +/******************************************************************************* + * Copyright (c) 2011 protos software gmbh (http://www.protos.de). + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * CONTRIBUTORS: + * Thomas Schuetz + * + *******************************************************************************/ + +package org.eclipse.etrice.runtime.java.messaging; + +/** + * RTServices is the single point of access to all runtime services in one SubSystem + * e.g. MessageServices, DebuggingService, ... + * + * @author Thomas Schuetz + * + */ +public class RTServices { + + private RTServices(){ + messageServiceController = new MessageServiceController(); + } + + public static RTServices getInstance(){ + if (instance == null){ + instance = new RTServices(); + } + return instance; + } + + public MessageServiceController getMsgSvcCtrl(){ + assert(messageServiceController != null); + return messageServiceController; + } + + private static RTServices instance = null; + private MessageServiceController messageServiceController = null; +} diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ActorClassBase.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ActorClassBase.java index de874bd1a..57a8eb84a 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ActorClassBase.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/ActorClassBase.java @@ -13,6 +13,7 @@ import org.eclipse.etrice.runtime.java.messaging.IMessageReceiver; import org.eclipse.etrice.runtime.java.messaging.IRTObject; import org.eclipse.etrice.runtime.java.messaging.Message; import org.eclipse.etrice.runtime.java.messaging.MessageService; +import org.eclipse.etrice.runtime.java.messaging.RTServices; /** * The base class for model actor classes. @@ -36,13 +37,14 @@ public abstract class ActorClassBase extends EventReceiver implements IMessageRe */ protected int state; - private MessageService msgsvc = null; + private MessageService ownMsgsvc = null; + private Address ownAddr = null; - public ActorClassBase(IRTObject parent, String name, IMessageReceiver msgsvc) { + public ActorClassBase(IRTObject parent, String name, Address ownAddr) { super(parent, name); - if (msgsvc instanceof MessageService) - this.msgsvc = (MessageService) msgsvc; + this.ownAddr = ownAddr; + ownMsgsvc = RTServices.getInstance().getMsgSvcCtrl().getMsgSvc(this.ownAddr.threadID); } public String toString(){ @@ -77,6 +79,6 @@ public abstract class ActorClassBase extends EventReceiver implements IMessageRe } public MessageService getMsgsvc() { - return msgsvc; + return ownMsgsvc; } } 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 5ffe6ae84..5492c963e 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 @@ -12,6 +12,7 @@ import org.eclipse.etrice.runtime.java.messaging.AbstractMessageReceiver; import org.eclipse.etrice.runtime.java.messaging.Address; import org.eclipse.etrice.runtime.java.messaging.IMessageReceiver; import org.eclipse.etrice.runtime.java.messaging.MessageService; +import org.eclipse.etrice.runtime.java.messaging.RTServices; /** * The abstract base class for actor class interface items like ports and saps. @@ -21,30 +22,37 @@ import org.eclipse.etrice.runtime.java.messaging.MessageService; */ public abstract class InterfaceItemBase extends AbstractMessageReceiver { - private IMessageReceiver msgReceiver; + private IMessageReceiver ownMsgReceiver; + private IMessageReceiver peerMsgReceiver; private int localId; private int idx; private Address peerAddress; - public InterfaceItemBase (IEventReceiver actor, String name, int localId, int idx, Address address, Address peerAddress, IMessageReceiver msgReceiver){ - super(actor, address, name); - this.msgReceiver = msgReceiver; + public InterfaceItemBase (IEventReceiver actor, String name, int localId, int idx, Address ownAddress, Address peerAddress){ + super(actor, ownAddress, name); + this.ownMsgReceiver = RTServices.getInstance().getMsgSvcCtrl().getMsgSvc(ownAddress.threadID); + this.peerMsgReceiver = RTServices.getInstance().getMsgSvcCtrl().getMsgSvc(peerAddress.threadID); this.localId = localId; this.idx = idx; this.peerAddress = peerAddress; - if (getAddress()!=null && msgReceiver instanceof MessageService) { - MessageService ms = (MessageService) msgReceiver; + if (getAddress()!=null && this.ownMsgReceiver instanceof MessageService) { + MessageService ms = (MessageService) this.ownMsgReceiver; + // register at the own dispatcher to receive messages ms.getMessageDispatcher().addMessageReceiver(this); } } protected IMessageReceiver getMsgReceiver() { - return msgReceiver; + return ownMsgReceiver; + } + + protected IMessageReceiver getPeerMsgReceiver() { + return peerMsgReceiver; } public void setMsgReceiver(IMessageReceiver msgReceiver) { - this.msgReceiver = msgReceiver; + this.ownMsgReceiver = msgReceiver; } public IEventReceiver getActor() { diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/PortBase.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/PortBase.java index 67f346fe6..9a4989b87 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/PortBase.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/PortBase.java @@ -19,7 +19,7 @@ import org.eclipse.etrice.runtime.java.messaging.IMessageReceiver; */ public abstract class PortBase extends InterfaceItemBase { - public PortBase (IEventReceiver actor, String name, int localId, int idx, Address address, Address peerAddress, IMessageReceiver msgReceiver){ - super(actor, name, localId, idx, address, peerAddress, msgReceiver); + public PortBase (IEventReceiver actor, String name, int localId, int idx, Address address, Address peerAddress){ + super(actor, name, localId, idx, address, peerAddress); } } diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/SubSystemClassBase.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/SubSystemClassBase.java index 398069176..6da6db7da 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/SubSystemClassBase.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/modelbase/SubSystemClassBase.java @@ -54,8 +54,12 @@ public abstract class SubSystemClassBase extends RTObject { System.out.println("*** MainComponent "+getInstancePath()+"::init ***"); // MessageService - RTServices.getInstance().getMsgSrvCtrl().addMsgSrv(new MessageService(this, new Address(0, 0, 0), "MessageService0")); - //instantiateMessageServices(); + instantiateMessageServices(); + + // this is the place to connect the message services if necessary + // normaly the ports will address the correct target message service directly + // it is just for test purposes + // RTServices.getInstance().getMsgSvcCtrl().connectAll(); instantiateActors(); @@ -66,7 +70,7 @@ public abstract class SubSystemClassBase extends RTObject { } } - //public abstract void instantiateMessageServices(); + public abstract void instantiateMessageServices(); public abstract void instantiateActors(); @@ -78,13 +82,13 @@ public abstract class SubSystemClassBase extends RTObject { } // start all message services - RTServices.getInstance().getMsgSrvCtrl().start(); + RTServices.getInstance().getMsgSvcCtrl().start(); running = true; } public void stop() { - RTServices.getInstance().getMsgSrvCtrl().stop(); + RTServices.getInstance().getMsgSvcCtrl().stop(); // stop all actor instances if (instances!=null) @@ -105,8 +109,8 @@ public abstract class SubSystemClassBase extends RTObject { System.out.println("*** MainComponent "+getInstancePath()+"::destroy ***"); } - public MessageService getMsgService() { - return RTServices.getInstance().getMsgSrvCtrl().getMessageService(0); + public MessageService getMsgService(int idx) { + return RTServices.getInstance().getMsgSvcCtrl().getMsgSvc(idx); } public ActorClassBase getInstance(int i) { -- cgit v1.2.3