@@ -9,6 +9,7 @@ use log::error;
99use serde:: { Deserialize , Serialize } ;
1010use std:: borrow:: Cow ;
1111use std:: fmt:: Display ;
12+ use tokio:: sync:: OnceCell ;
1213use std:: future;
1314use std:: str:: FromStr ;
1415use std:: time:: Duration ;
@@ -23,6 +24,9 @@ const FROMRADIO: Uuid = Uuid::from_u128(0x2c55e69e_4993_11ed_b878_0242ac120002);
2324const TORADIO : Uuid = Uuid :: from_u128 ( 0xf75c76d2_129e_4dad_a1dd_7866124401e7 ) ;
2425const FROMNUM : Uuid = Uuid :: from_u128 ( 0xed9da18c_a800_4f66_a670_aa7547e34453 ) ;
2526
27+ // We store all Bluetooth adapters in a OnceCell.
28+ static ADAPTERS : OnceCell < Vec < Adapter > > = OnceCell :: const_new ( ) ;
29+
2630pub struct BleHandler {
2731 radio : Peripheral ,
2832 adapter : Adapter ,
@@ -174,10 +178,17 @@ impl BleHandler {
174178 source : Box :: new ( e) ,
175179 description : "Failed to scan for BLE devices" . to_owned ( ) ,
176180 } ;
177- let manager = Manager :: new ( ) . await . map_err ( scan_error_fn) ?;
178- let adapters = manager. adapters ( ) . await . map_err ( scan_error_fn) ?;
181+
182+ let adapters = ADAPTERS
183+ . get_or_try_init ( || async {
184+ let manager = Manager :: new ( ) . await . map_err ( scan_error_fn) ?;
185+ //This call spawns a new never-ending thread, so we have to call it just once.
186+ manager. adapters ( ) . await . map_err ( scan_error_fn)
187+ } )
188+ . await ?;
189+
179190 let mut available_peripherals = Vec :: new ( ) ;
180- for adapter in & adapters {
191+ for adapter in adapters {
181192 let peripherals = Self :: scan_peripherals ( adapter, scan_duration) . await ;
182193 match peripherals {
183194 Err ( e) => {
0 commit comments