From f1621b629df60c29945392b5739ac97f33e31bdf Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 21 Jun 2024 16:14:37 +0200 Subject: Fix race condition in property observer code leading to futures.InvalidStateError Previously, prepare_and_wait_for_property was slightly confused on the lifetime of that future. This closes #282 --- mpv.py | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) (limited to 'mpv.py') diff --git a/mpv.py b/mpv.py index 9856dc2..75567c1 100644 --- a/mpv.py +++ b/mpv.py @@ -1036,30 +1036,38 @@ class MPV(object): rv = cond(val) if rv: result.set_result(rv) + + except InvalidStateError: + pass + except Exception as e: try: result.set_exception(e) - except InvalidStateError: + except: pass - except InvalidStateError: - pass - self.observe_property(name, observer) - err_unregister = self._set_error_handler(result) try: result.set_running_or_notify_cancel() + + self.observe_property(name, observer) + err_unregister = self._set_error_handler(result) if catch_errors: self._exception_futures.add(result) yield result - rv = cond(getattr(self, name.replace('-', '_'))) - if level_sensitive and rv: - result.set_result(rv) + if level_sensitive: + rv = cond(getattr(self, name.replace('-', '_'))) + if rv: + result.set_result(rv) + return + + self.check_core_alive() + result.result(timeout) + + except InvalidStateError: + pass - else: - self.check_core_alive() - result.result(timeout) finally: err_unregister() self.unobserve_property(name, observer) @@ -1821,9 +1829,6 @@ class MPV(object): pass else: warnings.warn(f'Unhandled exception {e} inside stream open callback for URI {uri}\n{traceback.format_exc()}') - - - return ErrorCode.LOADING_FAILED cb_info.contents.cookie = None -- cgit