diff options
-rw-r--r-- | bitbake/lib/bb/event.py | 73 | ||||
-rw-r--r-- | bitbake/lib/bb/tests/event.py | 17 |
2 files changed, 35 insertions, 55 deletions
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index db90724444..7826541a64 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py | |||
@@ -68,16 +68,15 @@ _catchall_handlers = {} | |||
68 | _eventfilter = None | 68 | _eventfilter = None |
69 | _uiready = False | 69 | _uiready = False |
70 | _thread_lock = threading.Lock() | 70 | _thread_lock = threading.Lock() |
71 | _thread_lock_enabled = False | ||
72 | _heartbeat_enabled = False | 71 | _heartbeat_enabled = False |
73 | 72 | ||
74 | def enable_threadlock(): | 73 | def enable_threadlock(): |
75 | global _thread_lock_enabled | 74 | # Always needed now |
76 | _thread_lock_enabled = True | 75 | return |
77 | 76 | ||
78 | def disable_threadlock(): | 77 | def disable_threadlock(): |
79 | global _thread_lock_enabled | 78 | # Always needed now |
80 | _thread_lock_enabled = False | 79 | return |
81 | 80 | ||
82 | def enable_heartbeat(): | 81 | def enable_heartbeat(): |
83 | global _heartbeat_enabled | 82 | global _heartbeat_enabled |
@@ -179,36 +178,30 @@ def print_ui_queue(): | |||
179 | 178 | ||
180 | def fire_ui_handlers(event, d): | 179 | def fire_ui_handlers(event, d): |
181 | global _thread_lock | 180 | global _thread_lock |
182 | global _thread_lock_enabled | ||
183 | 181 | ||
184 | if not _uiready: | 182 | if not _uiready: |
185 | # No UI handlers registered yet, queue up the messages | 183 | # No UI handlers registered yet, queue up the messages |
186 | ui_queue.append(event) | 184 | ui_queue.append(event) |
187 | return | 185 | return |
188 | 186 | ||
189 | if _thread_lock_enabled: | 187 | with _thread_lock: |
190 | _thread_lock.acquire() | 188 | errors = [] |
191 | 189 | for h in _ui_handlers: | |
192 | errors = [] | 190 | #print "Sending event %s" % event |
193 | for h in _ui_handlers: | 191 | try: |
194 | #print "Sending event %s" % event | 192 | if not _ui_logfilters[h].filter(event): |
195 | try: | 193 | continue |
196 | if not _ui_logfilters[h].filter(event): | 194 | # We use pickle here since it better handles object instances |
197 | continue | 195 | # which xmlrpc's marshaller does not. Events *must* be serializable |
198 | # We use pickle here since it better handles object instances | 196 | # by pickle. |
199 | # which xmlrpc's marshaller does not. Events *must* be serializable | 197 | if hasattr(_ui_handlers[h].event, "sendpickle"): |
200 | # by pickle. | 198 | _ui_handlers[h].event.sendpickle((pickle.dumps(event))) |
201 | if hasattr(_ui_handlers[h].event, "sendpickle"): | 199 | else: |
202 | _ui_handlers[h].event.sendpickle((pickle.dumps(event))) | 200 | _ui_handlers[h].event.send(event) |
203 | else: | 201 | except: |
204 | _ui_handlers[h].event.send(event) | 202 | errors.append(h) |
205 | except: | 203 | for h in errors: |
206 | errors.append(h) | 204 | del _ui_handlers[h] |
207 | for h in errors: | ||
208 | del _ui_handlers[h] | ||
209 | |||
210 | if _thread_lock_enabled: | ||
211 | _thread_lock.release() | ||
212 | 205 | ||
213 | def fire(event, d): | 206 | def fire(event, d): |
214 | """Fire off an Event""" | 207 | """Fire off an Event""" |
@@ -322,21 +315,23 @@ def set_eventfilter(func): | |||
322 | _eventfilter = func | 315 | _eventfilter = func |
323 | 316 | ||
324 | def register_UIHhandler(handler, mainui=False): | 317 | def register_UIHhandler(handler, mainui=False): |
325 | bb.event._ui_handler_seq = bb.event._ui_handler_seq + 1 | 318 | with _thread_lock: |
326 | _ui_handlers[_ui_handler_seq] = handler | 319 | bb.event._ui_handler_seq = bb.event._ui_handler_seq + 1 |
327 | level, debug_domains = bb.msg.constructLogOptions() | 320 | _ui_handlers[_ui_handler_seq] = handler |
328 | _ui_logfilters[_ui_handler_seq] = UIEventFilter(level, debug_domains) | 321 | level, debug_domains = bb.msg.constructLogOptions() |
329 | if mainui: | 322 | _ui_logfilters[_ui_handler_seq] = UIEventFilter(level, debug_domains) |
330 | global _uiready | 323 | if mainui: |
331 | _uiready = _ui_handler_seq | 324 | global _uiready |
332 | return _ui_handler_seq | 325 | _uiready = _ui_handler_seq |
326 | return _ui_handler_seq | ||
333 | 327 | ||
334 | def unregister_UIHhandler(handlerNum, mainui=False): | 328 | def unregister_UIHhandler(handlerNum, mainui=False): |
335 | if mainui: | 329 | if mainui: |
336 | global _uiready | 330 | global _uiready |
337 | _uiready = False | 331 | _uiready = False |
338 | if handlerNum in _ui_handlers: | 332 | with _thread_lock: |
339 | del _ui_handlers[handlerNum] | 333 | if handlerNum in _ui_handlers: |
334 | del _ui_handlers[handlerNum] | ||
340 | return | 335 | return |
341 | 336 | ||
342 | def get_uihandler(): | 337 | def get_uihandler(): |
diff --git a/bitbake/lib/bb/tests/event.py b/bitbake/lib/bb/tests/event.py index 4de4cced5e..d959f2d95d 100644 --- a/bitbake/lib/bb/tests/event.py +++ b/bitbake/lib/bb/tests/event.py | |||
@@ -451,10 +451,9 @@ class EventHandlingTest(unittest.TestCase): | |||
451 | and disable threadlocks tests """ | 451 | and disable threadlocks tests """ |
452 | bb.event.fire(bb.event.OperationStarted(), None) | 452 | bb.event.fire(bb.event.OperationStarted(), None) |
453 | 453 | ||
454 | def test_enable_threadlock(self): | 454 | def test_event_threadlock(self): |
455 | """ Test enable_threadlock method """ | 455 | """ Test enable_threadlock method """ |
456 | self._set_threadlock_test_mockups() | 456 | self._set_threadlock_test_mockups() |
457 | bb.event.enable_threadlock() | ||
458 | self._set_and_run_threadlock_test_workers() | 457 | self._set_and_run_threadlock_test_workers() |
459 | # Calls to UI handlers should be in order as all the registered | 458 | # Calls to UI handlers should be in order as all the registered |
460 | # handlers for the event coming from the first worker should be | 459 | # handlers for the event coming from the first worker should be |
@@ -462,20 +461,6 @@ class EventHandlingTest(unittest.TestCase): | |||
462 | self.assertEqual(self._threadlock_test_calls, | 461 | self.assertEqual(self._threadlock_test_calls, |
463 | ["w1_ui1", "w1_ui2", "w2_ui1", "w2_ui2"]) | 462 | ["w1_ui1", "w1_ui2", "w2_ui1", "w2_ui2"]) |
464 | 463 | ||
465 | |||
466 | def test_disable_threadlock(self): | ||
467 | """ Test disable_threadlock method """ | ||
468 | self._set_threadlock_test_mockups() | ||
469 | bb.event.disable_threadlock() | ||
470 | self._set_and_run_threadlock_test_workers() | ||
471 | # Calls to UI handlers should be intertwined together. Thanks to the | ||
472 | # delay in the registered handlers for the event coming from the first | ||
473 | # worker, the event coming from the second worker starts being | ||
474 | # processed before finishing handling the first worker event. | ||
475 | self.assertEqual(self._threadlock_test_calls, | ||
476 | ["w1_ui1", "w2_ui1", "w1_ui2", "w2_ui2"]) | ||
477 | |||
478 | |||
479 | class EventClassesTest(unittest.TestCase): | 464 | class EventClassesTest(unittest.TestCase): |
480 | """ Event classes test class """ | 465 | """ Event classes test class """ |
481 | 466 | ||