]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-132561: Fix the public `multiprocessing.SemLock.locked` method (#132586)
authorDuprat <yduprat@gmail.com>
Thu, 17 Apr 2025 09:41:30 +0000 (11:41 +0200)
committerGitHub <noreply@github.com>
Thu, 17 Apr 2025 09:41:30 +0000 (11:41 +0200)
Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
Lib/multiprocessing/synchronize.py
Lib/test/_test_multiprocessing.py
Misc/NEWS.d/next/Library/2025-04-16-11-44-56.gh-issue-132561.ekkDPE.rst [new file with mode: 0644]

index 771f1db8813852dbb30f2f1ca07216696243ccfa..30425047e9801a52f2a83b6649eee09167663df4 100644 (file)
@@ -91,7 +91,7 @@ class SemLock(object):
         self.release = self._semlock.release
 
     def locked(self):
-        return self._semlock._count() != 0
+        return self._semlock._is_zero()
 
     def __enter__(self):
         return self._semlock.__enter__()
index 1cd5704905f95c6123d9bfeabe9a40c30bf4024e..be6efc49e9489e38f5818084d4f4bcb3bf4e2855 100644 (file)
@@ -1492,6 +1492,27 @@ class _TestLock(BaseTestCase):
         self.assertFalse(lock.locked())
         self.assertRaises((ValueError, threading.ThreadError), lock.release)
 
+    @classmethod
+    def _test_lock_locked_2processes(cls, lock, event, res):
+        lock.acquire()
+        res.value = lock.locked()
+        event.set()
+
+    def test_lock_locked_2processes(self):
+        if self.TYPE != 'processes':
+            self.skipTest('test not appropriate for {}'.format(self.TYPE))
+
+        lock = self.Lock()
+        event = self.Event()
+        res = self.Value('b', 0)
+        p = self.Process(target=self._test_lock_locked_2processes,
+                         args=(lock, event, res))
+        p.start()
+        event.wait()
+        self.assertTrue(lock.locked())
+        self.assertTrue(res.value)
+        p.join()
+
     @staticmethod
     def _acquire_release(lock, timeout, l=None, n=1):
         for _ in range(n):
@@ -1561,6 +1582,22 @@ class _TestLock(BaseTestCase):
         self.assertFalse(lock.locked())
         self.assertRaises((AssertionError, RuntimeError), lock.release)
 
+    def test_rlock_locked_2processes(self):
+        if self.TYPE != 'processes':
+            self.skipTest('test not appropriate for {}'.format(self.TYPE))
+
+        rlock = self.RLock()
+        event = self.Event()
+        res = Value('b', 0)
+        # target is the same as for the test_lock_locked_2processes test.
+        p = self.Process(target=self._test_lock_locked_2processes,
+                         args=(rlock, event, res))
+        p.start()
+        event.wait()
+        self.assertTrue(rlock.locked())
+        self.assertTrue(res.value)
+        p.join()
+
     def test_lock_context(self):
         with self.Lock() as locked:
             self.assertTrue(locked)
diff --git a/Misc/NEWS.d/next/Library/2025-04-16-11-44-56.gh-issue-132561.ekkDPE.rst b/Misc/NEWS.d/next/Library/2025-04-16-11-44-56.gh-issue-132561.ekkDPE.rst
new file mode 100644 (file)
index 0000000..862db02
--- /dev/null
@@ -0,0 +1,2 @@
+Fix the public ``locked`` method of ``multiprocessing.SemLock`` class.\r
+Also adding 2 tests for the derivated :class:`multiprocessing.Lock` and :class:`multiprocessing.RLock` classes.\r