summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIWAMOTO Toshihiro <iwamoto@valinux.co.jp>2015-12-24 14:09:39 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2015-12-25 10:03:53 +0900
commitc085c0d40ebdb6f568f61cd08a044981890b0151 (patch)
tree8ba03f8ad799c921fe03e2e3e5f7dfbb0a5a1e0b
parent4feded18f3720dd0efacbfccd8974ff093a8c2d4 (diff)
Ensure to terminate threads where RyuApp.start() gives a thread object
Otherwise, AppManager.run_apps fails to terminate. Signed-off-by: IWAMOTO Toshihiro <iwamoto@valinux.co.jp> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/base/app_manager.py12
-rw-r--r--ryu/services/protocols/ovsdb/manager.py1
2 files changed, 13 insertions, 0 deletions
diff --git a/ryu/base/app_manager.py b/ryu/base/app_manager.py
index 5b63e8cd..3d5d8959 100644
--- a/ryu/base/app_manager.py
+++ b/ryu/base/app_manager.py
@@ -156,6 +156,7 @@ class RyuApp(object):
self.event_handlers = {} # ev_cls -> handlers:list
self.observers = {} # ev_cls -> observer-name -> states:set
self.threads = []
+ self.main_thread = None
self.events = hub.Queue(128)
if hasattr(self.__class__, 'LOGGER_NAME'):
self.logger = logging.getLogger(self.__class__.LOGGER_NAME)
@@ -176,10 +177,20 @@ class RyuApp(object):
self.threads.append(hub.spawn(self._event_loop))
def stop(self):
+ if self.main_thread:
+ hub.kill(self.main_thread)
self.is_active = False
self._send_event(self._event_stop, None)
hub.joinall(self.threads)
+ def set_main_thread(self, thread):
+ """
+ Set self.main_thread so that stop() can terminate it.
+
+ Only AppManager.instantiate_apps should call this function.
+ """
+ self.main_thread = thread
+
def register_handler(self, ev_cls, handler):
assert callable(handler)
self.event_handlers.setdefault(ev_cls, [])
@@ -490,6 +501,7 @@ class AppManager(object):
for app in self.applications.values():
t = app.start()
if t is not None:
+ app.set_main_thread(t)
threads.append(t)
return threads
diff --git a/ryu/services/protocols/ovsdb/manager.py b/ryu/services/protocols/ovsdb/manager.py
index 7b1d5c83..e12935bb 100644
--- a/ryu/services/protocols/ovsdb/manager.py
+++ b/ryu/services/protocols/ovsdb/manager.py
@@ -118,6 +118,7 @@ class OVSDB(app_manager.RyuApp):
return t
def stop(self):
+ # TODO main_thread should be stopped first, not from super().stop
for client in self._clients.values():
client.stop()