diff --git a/radicale/storage.py b/radicale/storage.py index b135f20..b63a3e5 100644 --- a/radicale/storage.py +++ b/radicale/storage.py @@ -578,23 +578,26 @@ class Collection(BaseCollection): except OSError: cls.logger.debug("Locking not supported") cls._lock_file_locked = True - yield - with cls._lock: - if mode == "r": - cls._readers -= 1 - else: - cls._writer = False - if cls._readers == 0: - if os.name == "nt": - handle = msvcrt.get_osfhandle(cls._lock_file.fileno()) - overlapped = Overlapped() - if not unlock_file_ex(handle, 0, 1, 0, overlapped): - cls.logger.debug("Unlocking not supported") - elif os.name == "posix": - try: - fcntl.lockf(cls._lock_file.fileno(), fcntl.LOCK_UN) - except OSError: - cls.logger.debug("Unlocking not supported") - cls._lock_file_locked = False - if cls._waiters: - cls._waiters[0].notify() + try: + yield + finally: + with cls._lock: + if mode == "r": + cls._readers -= 1 + else: + cls._writer = False + if cls._readers == 0: + if os.name == "nt": + handle = msvcrt.get_osfhandle(cls._lock_file.fileno()) + overlapped = Overlapped() + if not unlock_file_ex(handle, 0, 1, 0, overlapped): + cls.logger.debug("Unlocking not supported") + elif os.name == "posix": + try: + fcntl.lockf(cls._lock_file.fileno(), + fcntl.LOCK_UN) + except OSError: + cls.logger.debug("Unlocking not supported") + cls._lock_file_locked = False + if cls._waiters: + cls._waiters[0].notify()