Skip to content

Commit 97b986c

Browse files
committed
tools: native_bt: hold task reference
Hold on to the returned task reference to prevent it from prematurely being cleaned up by the garbage collector before executing. Signed-off-by: Jordan Yates <jordan@embeint.com>
1 parent 07812a4 commit 97b986c

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

src/infuse_iot/tools/native_bt.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def __init__(self, database: DeviceDatabase, server: LocalServer, bleak_mapping:
6262
self._server = server
6363
self._mapping = bleak_mapping
6464
self._queues: dict[int, asyncio.Queue] = {}
65+
self._tasks: dict[int, asyncio.Task] = {}
6566

6667
def notification_handler(self, _characteristic: BleakGATTCharacteristic, data: bytearray):
6768
hdr, decr = CtypeBtGattFrame.decrypt(self._db, None, bytes(data))
@@ -140,6 +141,7 @@ async def create_connection(self, request: GatewayRequestConnectionRequest, dev:
140141

141142
# Queue no longer being handled
142143
self._queues.pop(request.infuse_id)
144+
self._tasks.pop(request.infuse_id)
143145
Console.log_info(f"{dev}: Terminating connection")
144146

145147
def datagram_received(self, data: bytes, addr: tuple[str | Any, int]):
@@ -168,7 +170,7 @@ def datagram_received(self, data: bytes, addr: tuple[str | Any, int]):
168170
q = asyncio.Queue()
169171
self._queues[request.infuse_id] = q
170172
# Create task to handle the connection
171-
loop.create_task(self.create_connection(request, ble_dev, q))
173+
self._tasks[request.infuse_id] = loop.create_task(self.create_connection(request, ble_dev, q))
172174

173175
def error_received(self, exc):
174176
Console.log_error(f"Error received: {exc}")
@@ -234,15 +236,14 @@ def simple_callback(self, device: BLEDevice, data: AdvertisementData):
234236

235237
async def async_bt_receiver(self):
236238
loop = asyncio.get_event_loop()
237-
loop.create_task(self.server_handler())
239+
handler = loop.create_task(self.server_handler())
238240

239241
scanner = BleakScanner(self.simple_callback, [str(InfuseBluetoothUUID.SERVICE_UUID)], cb=dict(use_bdaddr=True))
240242

241243
while True:
242244
Console.log_info("Starting scanner")
243245
async with scanner:
244-
# Run the scanner forever
245-
await asyncio.Future()
246+
await handler
246247

247248
def sync_request_handler(self):
248249
# Loop while there are packets to send

0 commit comments

Comments
 (0)