Prevent a potential recursion error in wait_for_either.

We shouldn't overwrite `event._set` and `event._clear` if those values
have already been set.

Those attributes hold the original references to `Event.set` and
`Event.clear` respectively, and the `OrEvent` logic overwrites them with
a callback-based logic.

This shouldn't happen if those attributes are already present.
This commit is contained in:
Fabio Manganiello 2024-04-14 23:27:13 +02:00
parent af1392b5b9
commit 6f8816d23d

View file

@ -24,8 +24,11 @@ def OrEvent(*events, cls: Type = threading.Event):
or_event.clear() or_event.clear()
def _to_or(e, changed_callback: Callable[[], None]): def _to_or(e, changed_callback: Callable[[], None]):
e._set = e.set if not hasattr(e, "_set"):
e._clear = e.clear e._set = e.set
if not hasattr(e, "_clear"):
e._clear = e.clear
e.changed = changed_callback e.changed = changed_callback
e.set = lambda: _or_set(e) e.set = lambda: _or_set(e)
e.clear = lambda: _clear_or(e) e.clear = lambda: _clear_or(e)