Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Haug2015-12-23 11:35:03 +0000
committerJuergen Haug2016-02-28 17:01:11 +0000
commit81750c5e633ad14e7ab25b016564af20fec0a1cc (patch)
tree951ca972625f09ffee924496591e97d927a74f0d /runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/MessageServiceController.cpp
parentdc98de4bb145d8d3789909e32c11765596165fbb (diff)
downloadorg.eclipse.etrice-81750c5e633ad14e7ab25b016564af20fec0a1cc.tar.gz
org.eclipse.etrice-81750c5e633ad14e7ab25b016564af20fec0a1cc.tar.xz
org.eclipse.etrice-81750c5e633ad14e7ab25b016564af20fec0a1cc.zip
[generators] added cpp generator draft
Diffstat (limited to 'runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/MessageServiceController.cpp')
-rw-r--r--runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/MessageServiceController.cpp146
1 files changed, 91 insertions, 55 deletions
diff --git a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/MessageServiceController.cpp b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/MessageServiceController.cpp
index 6a71f9a81..f6af90682 100644
--- a/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/MessageServiceController.cpp
+++ b/runtime/org.eclipse.etrice.runtime.cpp/src/common/messaging/MessageServiceController.cpp
@@ -14,68 +14,85 @@
namespace etRuntime {
+MessageServiceController::MessageServiceController() :
+ m_messageServices(),
+ m_freeIDs(),
+ m_running(false),
+ m_nextFreeID(0),
+ m_terminateServices(){
+ etMutex_construct(&m_mutex);
+ etSema_construct(&m_terminateSema);
+}
+
+int MessageServiceController::getNewID() {
+ etMutex_enter(&m_mutex);
+ int newID;
+ if (m_freeIDs.empty())
+ newID = m_nextFreeID++;
+ else {
+ newID = m_freeIDs.back();
+ m_freeIDs.pop();
+ }
+ etMutex_leave(&m_mutex);
-MessageServiceController::~MessageServiceController() {
- // TODO Auto-generated destructor stub
+ return newID;
}
-MessageServiceController::MessageServiceController(/*IRTObject parent*/)
- : m_messageServiceList(),
- m_running(false) {
- // TODO: Who is parent of MessageServices and Controller?
- // this.parent = parent;
+void MessageServiceController::freeID(int id) {
+ etMutex_enter(&m_mutex);
+ m_freeIDs.push(id);
+ etMutex_leave(&m_mutex);
}
-void MessageServiceController::addMsgSvc(MessageService& msgSvc) {
- // TODO TS: Who is parent of MessageServices ?
- //TODO assert
- //assert(msgSvc.getAddress().m_threadID == m_messageServiceList.size());
- m_messageServiceList.push_back(&msgSvc);
+void MessageServiceController::addMsgSvc(IMessageService& msgSvc) {
+ etMutex_enter(&m_mutex);
+ if (m_nextFreeID <= msgSvc.getAddress().m_threadID)
+ m_nextFreeID = msgSvc.getAddress().m_threadID + 1;
+
+ m_messageServices[msgSvc.getAddress().m_threadID] = &msgSvc;
+ etMutex_leave(&m_mutex);
}
-MessageService* MessageServiceController::getMsgSvc(int threadID) {
- return m_messageServiceList.at(threadID);
+void MessageServiceController::removeMsgSvc(IMessageService& msgSvc) {
+ etMutex_enter(&m_mutex);
+ m_messageServices.erase(msgSvc.getAddress().m_threadID);
+ etMutex_leave(&m_mutex);
}
-void MessageServiceController::connectAll() {
- for (size_t i = 0; i < m_messageServiceList.size(); i++) {
- MessageDispatcher& dispatcher = getMsgSvc(i)->getMessageDispatcher();
- for (size_t j = 0; j < m_messageServiceList.size(); j++) {
- if (i != j) {
- dispatcher.addMessageReceiver(*RTServices::getInstance().getMsgSvcCtrl().getMsgSvc(j));
- }
- }
- }
+IMessageService* MessageServiceController::getMsgSvc(int id) {
+ IMessageService* msgSvc = 0;
+ etMutex_enter(&m_mutex);
+ std::map<int, IMessageService*>::iterator it = m_messageServices.find(id);
+ if(it != m_messageServices.end())
+ msgSvc = it->second;
+ etMutex_leave(&m_mutex);
+
+ return msgSvc;
}
-void MessageServiceController::start(bool singlethreaded) {
+void MessageServiceController::start() {
// start all message services
- for (std::vector<MessageService*>::iterator it = m_messageServiceList.begin();
- it != m_messageServiceList.end(); ++it) {
- (*it)->start(singlethreaded);
+ for (std::map<int, IMessageService*>::iterator it = m_messageServices.begin(); it != m_messageServices.end(); ++it) {
+ (it->second)->start();
// TODO TS: start in order of priorities
}
m_running = true;
}
-void MessageServiceController::stop(bool singlethreaded) {
+void MessageServiceController::stop() {
+ if (!m_running)
+ return;
+
//dumpThreads("org.eclipse.etrice.runtime.java.messaging.MessageServiceController.stop()");
- if (! singlethreaded) {
- terminate();
- waitTerminate();
- }
-}
+ terminate();
+ waitTerminate();
-void MessageServiceController::waitTerminate() {
- for (std::vector<MessageService*>::iterator it = m_messageServiceList.begin();
- it != m_messageServiceList.end(); ++it) {
- (*it)->join();
- }
+ m_running = false;
}
void MessageServiceController::dumpThreads(std::string msg) {
- std::cout << "<<< begin dump threads <<<" << std::endl;
- std::cout << "=== " << msg << std::endl;
+// std::cout << "<<< begin dump threads <<<" << std::endl;
+// std::cout << "=== " << msg << std::endl;
//TODO dump stack traces
// Map<Thread, StackTraceElement[]> traces = Thread.getAllStackTraces();
// for (Thread thread : traces.keySet()) {
@@ -88,32 +105,51 @@ void MessageServiceController::dumpThreads(std::string msg) {
// std::cout << " " << elements[i].toString() << std::endl;
// }
// }
- std::cout <<(">>> end dump threads >>>");
+// std::cout <<(">>> end dump threads >>>");
}
void MessageServiceController::terminate() {
- if (!m_running) {
- return;
- }
- m_running = false;
-
// terminate all message services
- for (std::vector<MessageService*>::iterator it = m_messageServiceList.begin();
- it != m_messageServiceList.end(); ++it) {
- (*it)->terminate();
+ etMutex_enter(&m_mutex);
+ m_terminateServices = m_messageServices;
+ etMutex_leave(&m_mutex);
+
+ std::map<int, IMessageService*>::iterator it = m_terminateServices.begin();
+ for (; it != m_terminateServices.end(); ++it) {
+ (it->second)->terminate();
//TODO TS: stop in order of priorities
}
}
-void MessageServiceController::runOnce() {
- if (!m_running) {
- return;
+void MessageServiceController::waitTerminate() {
+ etBool wait = true;
+
+ while(wait){
+ etMutex_enter(&m_mutex);
+ wait = !m_terminateServices.empty();
+ etMutex_leave(&m_mutex);
+
+ if(wait)
+ etSema_waitForWakeup(&m_terminateSema);
}
+}
- for (std::vector<MessageService*>::iterator it = m_messageServiceList.begin();
- it != m_messageServiceList.end(); ++it) {
- (*it)->runOnce();
+void MessageServiceController::resetAll() {
+ stop();
+ etMutex_enter(&m_mutex);
+ m_messageServices.clear();
+ while (!m_freeIDs.empty()) {
+ m_freeIDs.pop();
}
+ m_nextFreeID = 0;
+ etMutex_leave(&m_mutex);
+}
+
+void MessageServiceController::setMsgSvcTerminated(const IMessageService& msgSvc){
+ etMutex_enter(&m_mutex);
+ m_terminateServices.erase(msgSvc.getAddress().m_threadID);
+ etSema_wakeup(&m_terminateSema);
+ etMutex_leave(&m_mutex);
}
} /* namespace etRuntime */

Back to the top