From 32c3b880b1336bd591cc048165b50a04c3019306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Pol=C3=A1=C4=8Dek?= Date: Thu, 20 Nov 2025 23:47:53 +0100 Subject: [PATCH] Store Manager::adapters() in OnceCell --- src/connections/ble_handler.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/connections/ble_handler.rs b/src/connections/ble_handler.rs index 23fce74..f84a6e0 100644 --- a/src/connections/ble_handler.rs +++ b/src/connections/ble_handler.rs @@ -12,6 +12,7 @@ use std::fmt::Display; use std::future; use std::str::FromStr; use std::time::Duration; +use tokio::sync::OnceCell; use uuid::Uuid; use crate::errors_internal::{BleConnectionError, Error, InternalStreamError}; @@ -23,6 +24,9 @@ const FROMRADIO: Uuid = Uuid::from_u128(0x2c55e69e_4993_11ed_b878_0242ac120002); const TORADIO: Uuid = Uuid::from_u128(0xf75c76d2_129e_4dad_a1dd_7866124401e7); const FROMNUM: Uuid = Uuid::from_u128(0xed9da18c_a800_4f66_a670_aa7547e34453); +// We store all Bluetooth adapters in a OnceCell. +static ADAPTERS: OnceCell> = OnceCell::const_new(); + pub struct BleHandler { radio: Peripheral, adapter: Adapter, @@ -174,10 +178,17 @@ impl BleHandler { source: Box::new(e), description: "Failed to scan for BLE devices".to_owned(), }; - let manager = Manager::new().await.map_err(scan_error_fn)?; - let adapters = manager.adapters().await.map_err(scan_error_fn)?; + + let adapters = ADAPTERS + .get_or_try_init(|| async { + let manager = Manager::new().await.map_err(scan_error_fn)?; + //This call spawns a new never-ending thread, so we have to call it just once. + manager.adapters().await.map_err(scan_error_fn) + }) + .await?; + let mut available_peripherals = Vec::new(); - for adapter in &adapters { + for adapter in adapters { let peripherals = Self::scan_peripherals(adapter, scan_duration).await; match peripherals { Err(e) => {