Skip to content

Commit 87bf24b

Browse files
committed
Store Manager::adapters() in OnceCell
1 parent 0a3a9da commit 87bf24b

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

src/connections/ble_handler.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use std::fmt::Display;
1212
use std::future;
1313
use std::str::FromStr;
1414
use std::time::Duration;
15+
use tokio::sync::OnceCell;
1516
use uuid::Uuid;
1617

1718
use crate::errors_internal::{BleConnectionError, Error, InternalStreamError};
@@ -23,6 +24,9 @@ const FROMRADIO: Uuid = Uuid::from_u128(0x2c55e69e_4993_11ed_b878_0242ac120002);
2324
const TORADIO: Uuid = Uuid::from_u128(0xf75c76d2_129e_4dad_a1dd_7866124401e7);
2425
const 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+
2630
pub 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

Comments
 (0)