Merge "eventletutils: Optimise EventletEvent.clear()"
This commit is contained in:
@@ -150,16 +150,12 @@ class EventletEvent(object):
|
|||||||
"""
|
"""
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(EventletEvent, self).__init__()
|
super(EventletEvent, self).__init__()
|
||||||
self._set = False
|
|
||||||
self.clear()
|
self.clear()
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
old_event = getattr(self, "_event", None)
|
if getattr(self, '_set', True):
|
||||||
was_set = self._set
|
|
||||||
self._set = False
|
self._set = False
|
||||||
self._event = _eventlet.event.Event()
|
self._event = _eventlet.event.Event()
|
||||||
if old_event is not None and not was_set:
|
|
||||||
old_event.send(True)
|
|
||||||
|
|
||||||
def is_set(self):
|
def is_set(self):
|
||||||
return self._set
|
return self._set
|
||||||
|
|||||||
@@ -201,6 +201,30 @@ class EventletUtilsTest(test_base.BaseTestCase):
|
|||||||
with eventlet.timeout.Timeout(0.7):
|
with eventlet.timeout.Timeout(0.7):
|
||||||
b.wait()
|
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')
|
@mock.patch('oslo_utils.eventletutils._eventlet.event.Event')
|
||||||
def test_event_clear_already_sent(self, mock_event):
|
def test_event_clear_already_sent(self, mock_event):
|
||||||
old_event = mock.Mock()
|
old_event = mock.Mock()
|
||||||
|
|||||||
Reference in New Issue
Block a user