|
6 | 6 |
|
7 | 7 | import asyncio |
8 | 8 | import logging |
| 9 | +from contextlib import suppress |
9 | 10 |
|
10 | 11 | from wslink import register as exportRpc |
11 | 12 | from wslink import schedule_callback |
@@ -75,21 +76,44 @@ class NetworkMonitor: |
75 | 76 | """ |
76 | 77 |
|
77 | 78 | def __init__(self): |
78 | | - |
79 | 79 | self.pending = 0 |
| 80 | + self._next_listener_id = 1 |
| 81 | + self._listeners = {} |
80 | 82 | self.event = asyncio.Event() |
81 | 83 |
|
| 84 | + def add_listener(self, enter, exit): |
| 85 | + """Register listener and return id to enable remove""" |
| 86 | + self._next_listener_id += 1 |
| 87 | + self._listeners[self._next_listener_id] = (enter, exit) |
| 88 | + return self._next_listener_id |
| 89 | + |
| 90 | + def remove_listener(self, key): |
| 91 | + """Unregister listener using its registration key""" |
| 92 | + return self._listeners.pop(key, None) |
| 93 | + |
82 | 94 | def network_call_completed(self): |
83 | 95 | """Trigger completion event""" |
84 | 96 | self.event.set() |
85 | 97 |
|
86 | 98 | def on_enter(self, *_, **__): |
87 | 99 | """Increase pending request""" |
| 100 | + |
| 101 | + if self.pending == 0: |
| 102 | + for enter, _ in self._listeners.values(): |
| 103 | + with suppress(Exception): |
| 104 | + enter() |
| 105 | + |
88 | 106 | self.pending += 1 |
89 | 107 |
|
90 | 108 | def on_exit(self, *_, **__): |
91 | 109 | """Decrease pending request and trigger completion event if we reach 0 pending request""" |
92 | 110 | self.pending -= 1 |
| 111 | + |
| 112 | + if self.pending == 0: |
| 113 | + for _, exit in self._listeners.values(): |
| 114 | + with suppress(Exception): |
| 115 | + exit() |
| 116 | + |
93 | 117 | if self.pending == 0 and not self.event.is_set(): |
94 | 118 | self.event.set() |
95 | 119 |
|
|
0 commit comments