| 63 | |
| 64 | |
| 65 | class _Slot: |
| 66 | def __init__( |
| 67 | self, |
| 68 | close_if_idle: bool, |
| 69 | nextcall: CallLaterOnce[None], |
| 70 | scheduler: BaseScheduler, |
| 71 | ) -> None: |
| 72 | self.closing: Deferred[None] | None = None |
| 73 | self.inprogress: set[Request] = set() |
| 74 | self.close_if_idle: bool = close_if_idle |
| 75 | self.nextcall: CallLaterOnce[None] = nextcall |
| 76 | self.scheduler: BaseScheduler = scheduler |
| 77 | self.heartbeat: AsyncioLoopingCall | LoopingCall = create_looping_call( |
| 78 | nextcall.schedule |
| 79 | ) |
| 80 | |
| 81 | def add_request(self, request: Request) -> None: |
| 82 | self.inprogress.add(request) |
| 83 | |
| 84 | def remove_request(self, request: Request) -> None: |
| 85 | self.inprogress.remove(request) |
| 86 | self._maybe_fire_closing() |
| 87 | |
| 88 | async def close(self) -> None: |
| 89 | self.closing = Deferred() |
| 90 | self._maybe_fire_closing() |
| 91 | await maybe_deferred_to_future(self.closing) |
| 92 | |
| 93 | def _maybe_fire_closing(self) -> None: |
| 94 | if self.closing is not None and not self.inprogress: |
| 95 | if self.nextcall: |
| 96 | self.nextcall.cancel() |
| 97 | if self.heartbeat.running: |
| 98 | self.heartbeat.stop() |
| 99 | self.closing.callback(None) |
| 100 | |
| 101 | |
| 102 | class ExecutionEngine: |
no outgoing calls