If an AppManager.close call is started and all AppManager.services
are stop, AppManager.run_apps starts another close() call,
resulting in a strange error in close().  Prevent that using
a semaphore.

Signed-off-by: IWAMOTO Toshihiro <iwam...@valinux.co.jp>
---
 ryu/base/app_manager.py | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/ryu/base/app_manager.py b/ryu/base/app_manager.py
index 13e41f4..f684259 100644
--- a/ryu/base/app_manager.py
+++ b/ryu/base/app_manager.py
@@ -386,6 +386,7 @@ class AppManager(object):
         self.applications = {}
         self.contexts_cls = {}
         self.contexts = {}
+        self.close_sem = hub.Semaphore()
 
     def load_app(self, name):
         mod = utils.import_module(name)
@@ -541,7 +542,10 @@ class AppManager(object):
                 self._close(app)
             close_dict.clear()
 
-        for app_name in list(self.applications.keys()):
-            self.uninstantiate(app_name)
-        assert not self.applications
-        close_all(self.contexts)
+        # This semaphore prevents parallel execution of this function,
+        # as run_apps's finally clause starts another close() call.
+        with self.close_sem:
+            for app_name in list(self.applications.keys()):
+                self.uninstantiate(app_name)
+            assert not self.applications
+            close_all(self.contexts)
-- 
2.1.4


------------------------------------------------------------------------------
Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
Francisco, CA to explore cutting-edge tech and listen to tech luminaries
present their vision of the future. This family event has something for
everyone, including kids. Get more information and register today.
http://sdm.link/attshape
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to