https://github.com/python/cpython/commit/068d570be84eab2ef271204e7ba9dd37391791d4
commit: 068d570be84eab2ef271204e7ba9dd37391791d4
branch: 3.14
author: Miss Islington (bot) <[email protected]>
committer: vstinner <[email protected]>
date: 2025-05-22T17:12:21Z
summary:

[3.14] gh-134322: Fix `repr(threading.RLock)` (GH-134389) (#134528)

gh-134322: Fix `repr(threading.RLock)` (GH-134389)

Fix the `__repr__` value of `threading.RLock` from `_thread` module, when just 
created.
(cherry picked from commit fade146cfb1616ad7b3b918bedb86756dedf79e6)

Co-authored-by: Duprat <[email protected]>

files:
M Lib/test/lock_tests.py
M Lib/test/test_importlib/test_locks.py
M Modules/_threadmodule.c

diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py
index 0e8c75ff5c4994..fb11f4828957ff 100644
--- a/Lib/test/lock_tests.py
+++ b/Lib/test/lock_tests.py
@@ -332,6 +332,26 @@ class RLockTests(BaseLockTests):
     """
     Tests for recursive locks.
     """
+    def test_repr_count(self):
+        # see gh-134322: check that count values are correct:
+        # when a rlock is just created,
+        # in a second thread when rlock is acquired in the main thread.
+        lock = self.locktype()
+        self.assertIn("count=0", repr(lock))
+        self.assertIn("<unlocked", repr(lock))
+        lock.acquire()
+        lock.acquire()
+        self.assertIn("count=2", repr(lock))
+        self.assertIn("<locked", repr(lock))
+
+        result = []
+        def call_repr():
+            result.append(repr(lock))
+        with Bunch(call_repr, 1):
+            pass
+        self.assertIn("count=2", result[0])
+        self.assertIn("<locked", result[0])
+
     def test_reacquire(self):
         lock = self.locktype()
         lock.acquire()
diff --git a/Lib/test/test_importlib/test_locks.py 
b/Lib/test/test_importlib/test_locks.py
index befac5d62b0abf..655e5881a1530b 100644
--- a/Lib/test/test_importlib/test_locks.py
+++ b/Lib/test/test_importlib/test_locks.py
@@ -34,6 +34,7 @@ class ModuleLockAsRLockTests:
     # lock status in repr unsupported
     test_repr = None
     test_locked_repr = None
+    test_repr_count = None
 
     def tearDown(self):
         for splitinit in init.values():
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index 8bd59fffa66f88..f676659af369f6 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -1208,7 +1208,13 @@ rlock_repr(PyObject *op)
     rlockobject *self = rlockobject_CAST(op);
     PyThread_ident_t owner = self->lock.thread;
     int locked = rlock_locked_impl(self);
-    size_t count = self->lock.level + 1;
+    size_t count;
+    if (locked) {
+        count = self->lock.level + 1;
+    }
+    else {
+        count = 0;
+    }
     return PyUnicode_FromFormat(
         "<%s %s object owner=%" PY_FORMAT_THREAD_IDENT_T " count=%zu at %p>",
         locked ? "locked" : "unlocked",

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to