Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/virtualenv/util/lock.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/virtualenv/util/lock.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -"""holds locking functionality that works across processes""" -from __future__ import absolute_import, unicode_literals - -import logging -import os -from contextlib import contextmanager -from threading import Lock, RLock - -from filelock import FileLock, Timeout - -from virtualenv.util.path import Path - - -class _CountedFileLock(FileLock): - def __init__(self, lock_file): - super(_CountedFileLock, self).__init__(lock_file) - self.count = 0 - self.thread_safe = RLock() - - def acquire(self, timeout=None, poll_intervall=0.05): - with self.thread_safe: - if self.count == 0: - super(_CountedFileLock, self).acquire(timeout=timeout, poll_intervall=poll_intervall) - self.count += 1 - - def release(self, force=False): - with self.thread_safe: - if self.count == 1: - super(_CountedFileLock, self).release() - self.count = max(self.count - 1, 0) - - -_lock_store = {} -_store_lock = Lock() - - -class ReentrantFileLock(object): - def __init__(self, folder): - self._lock = None - path = Path(folder) - self.path = path.resolve() if path.exists() else path - - def __repr__(self): - return "{}({})".format(self.__class__.__name__, self.path) - - def __div__(self, other): - return ReentrantFileLock(self.path / other) - - def __truediv__(self, other): - return self.__div__(other) - - def _create_lock(self, name=""): - lock_file = str(self.path / "{}.lock".format(name)) - with _store_lock: - if lock_file not in _lock_store: - _lock_store[lock_file] = _CountedFileLock(lock_file) - return _lock_store[lock_file] - - @staticmethod - def _del_lock(lock): - with _store_lock: - if lock is not None: - with lock.thread_safe: - if lock.count == 0: - _lock_store.pop(lock.lock_file, None) - - def __del__(self): - self._del_lock(self._lock) - - def __enter__(self): - self._lock = self._create_lock() - self._lock_file(self._lock) - - def __exit__(self, exc_type, exc_val, exc_tb): - self._release(self._lock) - - def _lock_file(self, lock): - # multiple processes might be trying to get a first lock... so we cannot check if this directory exist without - # a lock, but that lock might then become expensive, and it's not clear where that lock should live. - # Instead here we just ignore if we fail to create the directory. - try: - os.makedirs(str(self.path)) - except OSError: - pass - try: - lock.acquire(0.0001) - except Timeout: - logging.debug("lock file %s present, will block until released", lock.lock_file) - lock.release() # release the acquire try from above - lock.acquire() - - @staticmethod - def _release(lock): - lock.release() - - @contextmanager - def lock_for_key(self, name): - lock = self._create_lock(name) - try: - try: - self._lock_file(lock) - yield - finally: - self._release(lock) - finally: - self._del_lock(lock)
