(self)
| 446 | raise LockTimeout(self.path) |
| 447 | |
| 448 | def release(self): |
| 449 | if self.is_exclusive: |
| 450 | self._roster.modify(EXCLUSIVE, REMOVE) |
| 451 | if self._roster.empty(EXCLUSIVE, SHARED): |
| 452 | self._roster.remove() |
| 453 | self._lock.release() |
| 454 | else: |
| 455 | with self._lock: |
| 456 | self._roster.modify(SHARED, REMOVE) |
| 457 | if self._roster.empty(EXCLUSIVE, SHARED): |
| 458 | self._roster.remove() |
| 459 | |
| 460 | def upgrade(self): |
| 461 | # WARNING: if multiple read-lockers want to upgrade, it will deadlock because they |