summaryrefslogtreecommitdiff
path: root/mpv.py
diff options
context:
space:
mode:
authorjaseg <git@jaseg.de>2024-06-21 16:14:37 +0200
committerjaseg <git@jaseg.de>2024-06-21 16:14:37 +0200
commitf1621b629df60c29945392b5739ac97f33e31bdf (patch)
tree82c12af9584ef82f2a1544edfb4f35980b677493 /mpv.py
parent5bb298ad11b7ad7dbeeddfd87546c0d34b28397c (diff)
downloadpython-mpv-f1621b629df60c29945392b5739ac97f33e31bdf.tar.gz
python-mpv-f1621b629df60c29945392b5739ac97f33e31bdf.tar.bz2
python-mpv-f1621b629df60c29945392b5739ac97f33e31bdf.zip
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
Diffstat (limited to 'mpv.py')
-rw-r--r--mpv.py33
1 files changed, 19 insertions, 14 deletions
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