summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mpv.py33
-rwxr-xr-xtests/test_mpv.py22
2 files changed, 40 insertions, 15 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
diff --git a/tests/test_mpv.py b/tests/test_mpv.py
index 0935a32..6a962f0 100755
--- a/tests/test_mpv.py
+++ b/tests/test_mpv.py
@@ -23,7 +23,7 @@ from contextlib import contextmanager
import os.path
import os
import time
-from concurrent.futures import Future
+from concurrent.futures import Future, InvalidStateError
os.environ["PATH"] = os.path.dirname(__file__) + os.pathsep + os.environ["PATH"]
@@ -915,6 +915,25 @@ class CommandTests(MpvTestCase):
class RegressionTests(MpvTestCase):
+ def test_wait_for_property_concurrency(self):
+ players = [mpv.MPV(vo=testvo, loglevel='debug', log_handler=timed_print()) for i in range(2)]
+
+ try:
+ for _ in range(150):
+ for player in players:
+ player.play('tests/test.webm')
+ for player in players:
+ player.wait_for_property('seekable')
+ for player in players:
+ player.seek(0, reference='absolute', precision='exact')
+
+ except InvalidStateError:
+ self.fail('InvalidStateError thrown from wait_for_property')
+
+ finally:
+ for player in players:
+ player.terminate()
+
def test_unobserve_property_runtime_error(self):
"""
Ensure a `RuntimeError` is not thrown within
@@ -966,3 +985,4 @@ class RegressionTests(MpvTestCase):
m.slang = 'ru'
m.terminate() # needed for synchronization of event thread
handler.assert_has_calls([mock.call('slang', ['jp']), mock.call('slang', ['ru'])])
+