summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.openstack.org>2019-04-16 11:03:25 +0000
committerGerrit Code Review <review@openstack.org>2019-04-16 11:03:25 +0000
commit9a2ae8affd6c57af3c28471cad2fba4350b4b81b (patch)
treefcdc48c142f0f33b0ffe12afd9c3ee26b8553a5a
parent895062f3afc6135ba79267842c8616c4213cd925 (diff)
parentc5b065c3e4ffe76a3e8eb3b9668a38fd2c16f3a5 (diff)
downloadoslo-utils-9a2ae8affd6c57af3c28471cad2fba4350b4b81b.tar.gz
Merge "eventletutils: Optimise EventletEvent.clear()"
-rw-r--r--oslo_utils/eventletutils.py10
-rw-r--r--oslo_utils/tests/test_eventletutils.py24
2 files changed, 27 insertions, 7 deletions
diff --git a/oslo_utils/eventletutils.py b/oslo_utils/eventletutils.py
index 5d3c0a6..2770de1 100644
--- a/oslo_utils/eventletutils.py
+++ b/oslo_utils/eventletutils.py
@@ -150,16 +150,12 @@ class EventletEvent(object):
"""
def __init__(self, *args, **kwargs):
super(EventletEvent, self).__init__()
- self._set = False
self.clear()
def clear(self):
- old_event = getattr(self, "_event", None)
- was_set = self._set
- self._set = False
- self._event = _eventlet.event.Event()
- if old_event is not None and not was_set:
- old_event.send(True)
+ if getattr(self, '_set', True):
+ self._set = False
+ self._event = _eventlet.event.Event()
def is_set(self):
return self._set
diff --git a/oslo_utils/tests/test_eventletutils.py b/oslo_utils/tests/test_eventletutils.py
index b6ce995..d96851c 100644
--- a/oslo_utils/tests/test_eventletutils.py
+++ b/oslo_utils/tests/test_eventletutils.py
@@ -201,6 +201,30 @@ class EventletUtilsTest(test_base.BaseTestCase):
with eventlet.timeout.Timeout(0.7):
b.wait()
+ def test_event_set_clear_timeout(self):
+ event = eventletutils.EventletEvent()
+ wakes = []
+
+ def thread_func():
+ result = event.wait(0.2)
+ wakes.append(result)
+ if len(wakes) == 1:
+ self.assertTrue(result)
+ event.clear()
+ else:
+ self.assertFalse(result)
+
+ a = greenthread.spawn(thread_func)
+ b = greenthread.spawn(thread_func)
+ eventlet.sleep(0) # start threads
+ event.set()
+
+ with eventlet.timeout.Timeout(0.3):
+ a.wait()
+ b.wait()
+ self.assertFalse(event.is_set())
+ self.assertEqual([True, False], wakes)
+
@mock.patch('oslo_utils.eventletutils._eventlet.event.Event')
def test_event_clear_already_sent(self, mock_event):
old_event = mock.Mock()