Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: e022f616f9a0a21067bc80e86352dc73c23e48d8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 * MessageServiceController.cpp
 *
 *  Created on: 22.08.2012
 *      Author: karlitsc
 */

#include "MessageServiceController.h"

namespace etRuntime {


MessageServiceController::~MessageServiceController() {
	// TODO Auto-generated destructor stub
}

MessageServiceController::MessageServiceController(/*IRTObject parent*/)
	: 	m_messageServiceList(),
		m_running(false) {
	// TODO: Who is parent of MessageServices and Controller?
	// this.parent = parent;
}

void MessageServiceController::addMsgSvc(MessageService& msgSvc) {
	// TODOTS: Who is parent of MessageServices ?
	//TODO assert
	//assert(msgSvc.getAddress().m_threadID == m_messageServiceList.size());
	m_messageServiceList.push_back(&msgSvc);
}

MessageService* MessageServiceController::getMsgSvc(int threadID) {
	return m_messageServiceList.at(threadID);
}

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));
			}
		}
	}
}

void MessageServiceController::start() {
	// start all message services
	for (std::vector<MessageService*>::iterator it = m_messageServiceList.begin();
			it != m_messageServiceList.end(); ++it) {
		//TODO start thread
		//msgSvc.start();
		// TODOTS: start in order of priorities
	}
	m_running = true;
}

void MessageServiceController::stop() {
	//dumpThreads("org.eclipse.etrice.runtime.java.messaging.MessageServiceController.stop()");
	terminate();
	waitTerminate();
}

void MessageServiceController::waitTerminate() {
	for (std::vector<MessageService*>::iterator it = m_messageServiceList.begin();
			it != m_messageServiceList.end(); ++it) {
		//try {
			//TODO thread join
			//msgSvc.join();
		//} catch (InterruptedException e1) {
		//}
	}
}

void MessageServiceController::dumpThreads(std::string msg) {
	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()) {
//			std::cout << "thread " << thread.getName() << std::endl;
//			StackTraceElement[] elements = traces.get(thread);
//			int n = 2;
//			if (elements.length < n)
//				n = elements.length;
//			for (int i = 0; i < n; i++) {
//				std::cout << " " << elements[i].toString() << std::endl;
//			}
//		}
	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) {
		//TODO: terminate thread
		//msgSvc.terminate();
		// TODOTS: stop in order of priorities
	}
}

} /* namespace etRuntime */

Back to the top