From 06fc052524cf9577c9d5ad7064b02c10118925bd Mon Sep 17 00:00:00 2001
From: "Victor J. Orlikowski" <vjo@duke.edu>
Date: Fri, 26 Feb 2016 11:20:27 -0500
Subject: [PATCH] Protect events queue with a semaphore, due to a discovered
 bug in eventlet queue put(). This is a temporary workaround until eventlet is
 fixed.

---
 ryu/base/app_manager.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/ryu/base/app_manager.py b/ryu/base/app_manager.py
index 3d5d895..cc51008 100644
--- a/ryu/base/app_manager.py
+++ b/ryu/base/app_manager.py
@@ -158,6 +158,7 @@ class RyuApp(object):
         self.threads = []
         self.main_thread = None
         self.events = hub.Queue(128)
+        self._events_sem = hub.BoundedSemaphore(self.events.maxsize)
         if hasattr(self.__class__, 'LOGGER_NAME'):
             self.logger = logging.getLogger(self.__class__.LOGGER_NAME)
         else:
@@ -280,6 +281,7 @@ class RyuApp(object):
     def _event_loop(self):
         while self.is_active or not self.events.empty():
             ev, state = self.events.get()
+            self._events_sem.release()
             if ev == self._event_stop:
                 continue
             handlers = self.get_handlers(ev, state)
@@ -287,6 +289,7 @@ class RyuApp(object):
                 handler(ev)
 
     def _send_event(self, ev, state):
+        self._events_sem.acquire()
         self.events.put((ev, state))
 
     def send_event(self, name, ev, state=None):
-- 
2.5.4 (Apple Git-61)

