def __acquire_without_hubs(self, timeout): thread_lock = self._allocate_lock() thread_lock.acquire() absolute_expiration = 0 begin = 0 if timeout: absolute_expiration = monotonic() + timeout # Cython won't compile a lambda here link = _LockReleaseLink(thread_lock) while 1: self.__add_link(link) if absolute_expiration: begin = monotonic() got_native = self.__spin_on_native_lock(thread_lock, timeout) self._quiet_unlink_all(link) if got_native: if self.acquire(0): return True if absolute_expiration: now = monotonic() if now >= absolute_expiration: return False duration = now - begin timeout -= duration if timeout <= 0: return False
def __spin_on_native_lock(self, thread_lock, timeout): expiration = 0 if timeout: expiration = monotonic() + timeout self._drop_lock_for_switch_out() try: # TODO: When timeout is given and the lock supports that # (Python 3), pass that. # Python 2 has terrible behaviour where lock acquires can't # be interrupted, so we use a spin loop while not thread_lock.acquire(0): if expiration and monotonic() >= expiration: return False _native_sleep(0.001) return True finally: self._acquire_lock_for_switch_in()