]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Rewrite on to use `with` instead of explicit acquire
authorHeckad <heckad@yandex.ru>
Wed, 1 Jan 2020 17:50:41 +0000 (20:50 +0300)
committerHeckad <heckad@yandex.ru>
Wed, 1 Jan 2020 17:50:41 +0000 (20:50 +0300)
lib/sqlalchemy/ext/automap.py
lib/sqlalchemy/ext/declarative/base.py
lib/sqlalchemy/orm/__init__.py
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/pool/dbapi_proxy.py
lib/sqlalchemy/util/_collections.py
lib/sqlalchemy/util/langhelpers.py
lib/sqlalchemy/util/queue.py
test/engine/test_pool.py

index 5fa4e882208a80436c6a00e3bfa1b3896e278201..4102400c86ccd287ec580c545595e4bea544f010 100644 (file)
@@ -762,8 +762,7 @@ class AutomapBase(object):
                 autoload_replace=False,
             )
 
-        _CONFIGURE_MUTEX.acquire()
-        try:
+        with _CONFIGURE_MUTEX:
             table_to_map_config = dict(
                 (m.local_table, m)
                 for m in _DeferredMapperConfig.classes_for_base(
@@ -818,8 +817,7 @@ class AutomapBase(object):
 
             for map_config in _DeferredMapperConfig.classes_for_base(cls):
                 map_config.map()
-        finally:
-            _CONFIGURE_MUTEX.release()
+
 
     _sa_decl_prepare = True
     """Indicate that the mapping of classes should be deferred.
index 622a837363c0163016cafe1d80892d2ff5ea47df..4247c79d7113ccfa5c745da9b2393c17cea3da58 100644 (file)
@@ -179,8 +179,7 @@ class _MapperConfig(object):
 
         self._scan_attributes()
 
-        mapperlib._CONFIGURE_MUTEX.acquire()
-        try:
+        with mapperlib._CONFIGURE_MUTEX:
             clsregistry.add_class(self.classname, self.cls)
 
             self._extract_mappable_attributes()
@@ -192,8 +191,6 @@ class _MapperConfig(object):
             self._setup_inheritance()
 
             self._early_mapping()
-        finally:
-            mapperlib._CONFIGURE_MUTEX.release()
 
     def _early_mapping(self):
         self.map()
index e2eb934095d967b873ef61f61ad4d7865182af4c..dc9caaf684a36d5efac4b056f711d8a0afe99349 100644 (file)
@@ -231,17 +231,14 @@ def clear_mappers():
     upon a fixed set of classes.
 
     """
-    mapperlib._CONFIGURE_MUTEX.acquire()
-    try:
-        while _mapper_registry:
-            try:
-                # can't even reliably call list(weakdict) in jython
-                mapper, b = _mapper_registry.popitem()
-                mapper.dispose()
-            except KeyError:
-                pass
-    finally:
-        mapperlib._CONFIGURE_MUTEX.release()
+    with mapperlib._CONFIGURE_MUTEX, _mapper_registry:
+        try:
+            # can't even reliably call list(weakdict) in jython
+            mapper, b = _mapper_registry.popitem()
+            mapper.dispose()
+        except KeyError:
+            pass
+
 
 
 joinedload = strategy_options.joinedload._unbound_fn
index c23aaf9ef6731bab902f6e5720d870c8d03a9d2b..1e4f1a2fa759bff0a13d0fad1163a909e3421edd 100644 (file)
@@ -698,8 +698,7 @@ class Mapper(sql_base.HasCacheKey, InspectionAttr):
         # prevent this mapper from being constructed
         # while a configure_mappers() is occurring (and defer a
         # configure_mappers() until construction succeeds)
-        _CONFIGURE_MUTEX.acquire()
-        try:
+        with _CONFIGURE_MUTEX:
             self.dispatch._events._new_mapper_instance(class_, self)
             self._configure_inheritance()
             self._configure_class_instrumentation()
@@ -709,8 +708,6 @@ class Mapper(sql_base.HasCacheKey, InspectionAttr):
             Mapper._new_mappers = True
             self._log("constructed")
             self._expire_memoizations()
-        finally:
-            _CONFIGURE_MUTEX.release()
 
     # major attributes initialized at the classlevel so that
     # they can be Sphinx-documented.
@@ -3167,8 +3164,7 @@ def configure_mappers():
     if not Mapper._new_mappers:
         return
 
-    _CONFIGURE_MUTEX.acquire()
-    try:
+    with _CONFIGURE_MUTEX:
         global _already_compiling
         if _already_compiling:
             return
@@ -3225,8 +3221,6 @@ def configure_mappers():
                 Mapper._new_mappers = False
         finally:
             _already_compiling = False
-    finally:
-        _CONFIGURE_MUTEX.release()
     Mapper.dispatch._for_class(Mapper).after_configured()
 
 
index d78d85d1fce48533df5ab71a33f7159034b13f47..77f567515ed40efd9796a2171ec3561297b8d9d8 100644 (file)
@@ -104,8 +104,7 @@ class _DBProxy(object):
         try:
             return self.pools[key]
         except KeyError:
-            self._create_pool_mutex.acquire()
-            try:
+            with self._create_pool_mutex:
                 if key not in self.pools:
                     kw.pop("sa_pool_key", None)
                     pool = self.poolclass(
@@ -115,8 +114,6 @@ class _DBProxy(object):
                     return pool
                 else:
                     return self.pools[key]
-            finally:
-                self._create_pool_mutex.release()
 
     def connect(self, *args, **kw):
         """Activate a connection to the database.
index 7b46bc8e6f422b71d09e6f06af334c05aef8c4ec..95e819a38b7ea65ebb7aed0fe41e3e91c188333c 100644 (file)
@@ -944,7 +944,7 @@ class LRUCache(dict):
         return self.capacity + self.capacity * self.threshold
 
     def _manage_size(self):
-        if not self._mutex.acquire(False):
+        if self._mutex.locked():
             return
         try:
             size_alert = bool(self.size_alert)
index 83f119660cf067de8b28fad087e9a3808b616c42..8124764be89321093a981050184948902f7b28ed 100644 (file)
@@ -1179,11 +1179,8 @@ def counter():
 
     # avoid the 2to3 "next" transformation...
     def _next():
-        lock.acquire()
-        try:
+        with lock:
             return next(counter)
-        finally:
-            lock.release()
 
     return _next
 
@@ -1362,14 +1359,11 @@ class symbol(object):
     _lock = compat.threading.Lock()
 
     def __new__(cls, name, doc=None, canonical=None):
-        cls._lock.acquire()
-        try:
+        with cls._lock:
             sym = cls.symbols.get(name)
             if sym is None:
                 cls.symbols[name] = sym = _symbol(name, doc, canonical)
             return sym
-        finally:
-            symbol._lock.release()
 
     @classmethod
     def parse_user_argument(
index 819d95684e8490b4f262d19e8b5ab3fa23d33aa5..29a358e319823d1b325ae95ad13049cbc3a362de 100644 (file)
@@ -17,7 +17,7 @@ producing a ``put()`` inside the ``get()`` and therefore a reentrant
 condition.
 
 """
-
+import functools
 from collections import deque
 from time import time as _time
 
@@ -39,6 +39,15 @@ class Full(Exception):
     pass
 
 
+def atomic(f):
+    @functools.wraps(f)
+    def decorated(self, *args, **kwargs):
+        with self.mutex:
+            return f(self, *args, **kwargs)
+
+    return decorated
+
+
 class Queue:
     def __init__(self, maxsize=0, use_lifo=False):
         """Initialize a queue object with a given maximum size.
@@ -63,31 +72,25 @@ class Queue:
         # If this queue uses LIFO or FIFO
         self.use_lifo = use_lifo
 
+    @atomic
     def qsize(self):
         """Return the approximate size of the queue (not reliable!)."""
 
-        self.mutex.acquire()
-        n = self._qsize()
-        self.mutex.release()
-        return n
+        return self._qsize()
 
+    @atomic
     def empty(self):
         """Return True if the queue is empty, False otherwise (not
         reliable!)."""
 
-        self.mutex.acquire()
-        n = self._empty()
-        self.mutex.release()
-        return n
+        return self._empty()
 
+    @atomic
     def full(self):
         """Return True if the queue is full, False otherwise (not
         reliable!)."""
 
-        self.mutex.acquire()
-        n = self._full()
-        self.mutex.release()
-        return n
+        return self._full()
 
     def put(self, item, block=True, timeout=None):
         """Put an item into the queue.
@@ -102,8 +105,7 @@ class Queue:
         (`timeout` is ignored in that case).
         """
 
-        self.not_full.acquire()
-        try:
+        with self.not_full:
             if not block:
                 if self._full():
                     raise Full
@@ -121,8 +123,6 @@ class Queue:
                     self.not_full.wait(remaining)
             self._put(item)
             self.not_empty.notify()
-        finally:
-            self.not_full.release()
 
     def put_nowait(self, item):
         """Put an item into the queue without blocking.
@@ -143,8 +143,7 @@ class Queue:
         return an item if one is immediately available, else raise the
         ``Empty`` exception (`timeout` is ignored in that case).
         """
-        self.not_empty.acquire()
-        try:
+        with self.not_empty:
             if not block:
                 if self._empty():
                     raise Empty
@@ -163,8 +162,6 @@ class Queue:
             item = self._get()
             self.not_full.notify()
             return item
-        finally:
-            self.not_empty.release()
 
     def get_nowait(self):
         """Remove and return an item from the queue without blocking.
@@ -193,7 +190,7 @@ class Queue:
 
     # Check whether the queue is full
     def _full(self):
-        return self.maxsize > 0 and len(self.queue) == self.maxsize
+        return 0 < self.maxsize == len(self.queue)
 
     # Put a new item in the queue
     def _put(self, item):
index 31b89373492315ca1fdaa89462fd4c36d46dbdc4..e4d6dba5736866e8af1319d59e2ea2e416565963 100644 (file)
@@ -970,11 +970,8 @@ class QueuePoolTest(PoolTestBase):
         dbapi = MockDBAPI()
 
         def creator():
-            mutex.acquire()
-            try:
+            with mutex:
                 return dbapi.connect()
-            finally:
-                mutex.release()
 
         success = []
         for timeout in (None, 30):