def async_unlock(self): """ Release the lock asynchronously. Release notification is available via the add_done_callback method of the returned Future instance. @returns: Future, result is None """ if self._lock_obj is not None: yield self._lock_obj.async_unlock() self._lock_obj = None self.locked = False self.settings.pop('PORTAGE_BUILDDIR_LOCKED', None) catdir_lock = AsynchronousLock(path=self._catdir, scheduler=self.scheduler) try: yield catdir_lock.async_start() yield catdir_lock.async_wait() except asyncio.CancelledError: if catdir_lock.poll() is None: catdir_lock.cancel() raise if catdir_lock.returncode == os.EX_OK: try: os.rmdir(self._catdir) except OSError: pass yield catdir_lock.async_unlock()
def async_lock(self): """ Acquire the lock asynchronously. Notification is available via the add_done_callback method of the returned Future instance. This raises an AlreadyLocked exception if async_lock() is called while a lock is already held. In order to avoid this, call async_unlock() or check whether the "locked" attribute is True or False before calling async_lock(). @returns: Future, result is None """ if self._lock_obj is not None: raise self.AlreadyLocked((self._lock_obj, )) dir_path = self.settings.get('PORTAGE_BUILDDIR') if not dir_path: raise AssertionError('PORTAGE_BUILDDIR is unset') catdir = os.path.dirname(dir_path) self._catdir = catdir try: portage.util.ensure_dirs(os.path.dirname(catdir), gid=portage.portage_gid, mode=0o70, mask=0) except PortageException: if not os.path.isdir(os.path.dirname(catdir)): raise catdir_lock = AsynchronousLock(path=catdir, scheduler=self.scheduler) builddir_lock = AsynchronousLock(path=dir_path, scheduler=self.scheduler) try: yield catdir_lock.async_start() yield catdir_lock.async_wait() self._assert_lock(catdir_lock) try: portage.util.ensure_dirs(catdir, gid=portage.portage_gid, mode=0o70, mask=0) except PortageException: if not os.path.isdir(catdir): raise yield builddir_lock.async_start() yield builddir_lock.async_wait() except asyncio.CancelledError: if catdir_lock.poll() is None: catdir_lock.cancel() if builddir_lock.poll() is None: builddir_lock.cancel() raise try: self._assert_lock(builddir_lock) except AssertionError: yield catdir_lock.async_unlock() raise self._lock_obj = builddir_lock self.locked = True self.settings['PORTAGE_BUILDDIR_LOCKED'] = '1' yield catdir_lock.async_unlock()