]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
asyncio: Make Semaphore(0) work properly.
authorGuido van Rossum <guido@dropbox.com>
Thu, 21 Nov 2013 19:07:45 +0000 (11:07 -0800)
committerGuido van Rossum <guido@dropbox.com>
Thu, 21 Nov 2013 19:07:45 +0000 (11:07 -0800)
Lib/asyncio/locks.py
Lib/test/test_asyncio/test_locks.py

index ac851e5cc4b4c5022f60c421a7df0549b58684c4..dd9f0f8b4fa773045ecb04030fb39e806cf681f5 100644 (file)
@@ -348,12 +348,12 @@ class Semaphore:
 
     def __init__(self, value=1, bound=False, *, loop=None):
         if value < 0:
-            raise ValueError("Semaphore initial value must be > 0")
+            raise ValueError("Semaphore initial value must be >= 0")
         self._value = value
         self._bound = bound
         self._bound_value = value
         self._waiters = collections.deque()
-        self._locked = False
+        self._locked = (value == 0)
         if loop is not None:
             self._loop = loop
         else:
index 19ef877af027af3fd13224800b41d977a5269726..539c5c38ee3aa28d8f9fbb312e9397b970174228 100644 (file)
@@ -684,6 +684,10 @@ class SemaphoreTests(unittest.TestCase):
         finally:
             events.set_event_loop(None)
 
+    def test_initial_value_zero(self):
+        sem = locks.Semaphore(0, loop=self.loop)
+        self.assertTrue(sem.locked())
+
     def test_repr(self):
         sem = locks.Semaphore(loop=self.loop)
         self.assertTrue(repr(sem).endswith('[unlocked,value:1]>'))