Skip to content

Commit e9d684f

Browse files
authored
Merge refactor/once-cell into staging (#62)
refactor: use OnceLock instead of SetLock - Use OnceLock where SetLock was previously used - Remove SetLock
1 parent fd42094 commit e9d684f

File tree

6 files changed

+86
-169
lines changed

6 files changed

+86
-169
lines changed

Cargo.lock

Lines changed: 22 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/event/event_repeater.rs

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
use log::error;
22
use std::{
33
collections::HashMap,
4-
sync::{Arc, Weak},
4+
sync::{Arc, OnceLock, Weak},
55
};
66
use thiserror::Error;
77
use tokio::{sync::Mutex, task::JoinHandle};
88
use uuid::Uuid;
99

10-
use crate::setlock::{SetLock, SetLockError};
11-
1210
use super::{Event, Subscription};
1311

1412
#[derive(Debug, Error)]
@@ -53,7 +51,7 @@ where
5351
T: Send + Sync + 'static,
5452
{
5553
pub event: Event<T>,
56-
weak: Mutex<SetLock<Weak<Self>>>,
54+
weak: OnceLock<Weak<Self>>,
5755
subscriptions: Mutex<HashMap<Uuid, (Subscription, JoinHandle<()>)>>,
5856
}
5957

@@ -68,25 +66,21 @@ where
6866
{
6967
let event = Event::new(name);
7068
let event_repeater = Self {
71-
weak: Mutex::new(SetLock::new()),
69+
weak: OnceLock::new(),
7270
event,
7371
subscriptions: Mutex::new(HashMap::new()),
7472
};
7573

7674
let arc = Arc::new(event_repeater);
7775
let weak = Arc::downgrade(&arc);
7876

79-
let result = arc.weak.lock().await.set(weak);
80-
if let Err(err) = result {
81-
match err {
82-
SetLockError::AlreadySet => {
83-
error!("Failed to set EventRepeater {}'s Weak self-reference because it was already set. This should never happen. Shutting down ungracefully to prevent further undefined behavior.", arc.event.name);
84-
unreachable!(
85-
"Unable to set EventRepeater {}'s Weak self-reference because it was already set.",
86-
arc.event.name
87-
);
88-
}
89-
}
77+
let result = arc.weak.set(weak);
78+
if result.is_err() {
79+
error!("Failed to set EventRepeater {}'s Weak self-reference because it was already set. This should never happen. Shutting down ungracefully to prevent further undefined behavior.", arc.event.name);
80+
unreachable!(
81+
"Unable to set EventRepeater {}'s Weak self-reference because it was already set.",
82+
arc.event.name
83+
);
9084
}
9185

9286
arc
@@ -97,8 +91,7 @@ where
9791
}
9892

9993
pub async fn attach(&self, event: &Event<T>, buffer: usize) -> Result<(), AttachError> {
100-
let lock = self.weak.lock().await;
101-
let weak = match lock.get() {
94+
let weak = match self.weak.get() {
10295
Some(weak) => weak,
10396
None => {
10497
return Err(AttachError::NotInitialized {

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ pub mod config;
88
pub mod event;
99
pub mod log;
1010
pub mod service;
11-
pub mod setlock;
1211

1312
pub fn is_debug() -> bool {
1413
cfg!(debug_assertions)

src/service/discord.rs

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
use crate::setlock::SetLock;
2-
31
use super::{types::LifetimedPinnedBoxedFutureResult, Priority, Service, ServiceInfo, ServiceManager};
4-
use log::{error, info};
2+
use log::{error, info, warn};
53
use serenity::{
64
all::{GatewayIntents, Ready},
75
async_trait,
@@ -12,7 +10,10 @@ use serenity::{
1210
prelude::TypeMap,
1311
Client, Error,
1412
};
15-
use std::{sync::Arc, time::Duration};
13+
use std::{
14+
sync::{Arc, OnceLock},
15+
time::Duration,
16+
};
1617
use tokio::{
1718
select, spawn,
1819
sync::{Mutex, Notify, RwLock},
@@ -24,29 +25,29 @@ use tokio::{
2425
pub struct DiscordService {
2526
info: ServiceInfo,
2627
discord_token: String,
27-
pub ready: Arc<Mutex<SetLock<Ready>>>,
28+
pub ready: Arc<OnceLock<Ready>>,
2829
client_handle: Option<JoinHandle<Result<(), Error>>>,
29-
pub cache: SetLock<Arc<Cache>>,
30-
pub data: SetLock<Arc<RwLock<TypeMap>>>,
31-
pub http: SetLock<Arc<Http>>,
32-
pub shard_manager: SetLock<Arc<ShardManager>>,
33-
pub voice_manager: SetLock<Arc<dyn VoiceGatewayManager>>,
34-
pub ws_url: SetLock<Arc<Mutex<String>>>,
30+
pub cache: OnceLock<Arc<Cache>>,
31+
pub data: OnceLock<Arc<RwLock<TypeMap>>>,
32+
pub http: OnceLock<Arc<Http>>,
33+
pub shard_manager: OnceLock<Arc<ShardManager>>,
34+
pub voice_manager: OnceLock<Arc<dyn VoiceGatewayManager>>,
35+
pub ws_url: OnceLock<Arc<Mutex<String>>>,
3536
}
3637

3738
impl DiscordService {
3839
pub fn new(discord_token: &str) -> Self {
3940
Self {
4041
info: ServiceInfo::new("lum_builtin_discord", "Discord", Priority::Essential),
4142
discord_token: discord_token.to_string(),
42-
ready: Arc::new(Mutex::new(SetLock::new())),
43+
ready: Arc::new(OnceLock::new()),
4344
client_handle: None,
44-
cache: SetLock::new(),
45-
data: SetLock::new(),
46-
http: SetLock::new(),
47-
shard_manager: SetLock::new(),
48-
voice_manager: SetLock::new(),
49-
ws_url: SetLock::new(),
45+
cache: OnceLock::new(),
46+
data: OnceLock::new(),
47+
http: OnceLock::new(),
48+
shard_manager: OnceLock::new(),
49+
voice_manager: OnceLock::new(),
50+
ws_url: OnceLock::new(),
5051
}
5152
}
5253
}
@@ -71,30 +72,38 @@ impl Service for DiscordService {
7172
))
7273
.await?;
7374

74-
if let Err(error) = self.cache.set(Arc::clone(&client.cache)) {
75-
return Err(format!("Failed to set cache SetLock: {}", error).into());
75+
if self.cache.set(Arc::clone(&client.cache)).is_err() {
76+
error!("Could not set cache OnceLock because it was already set. This should never happen.");
77+
return Err("Could not set cache OnceLock because it was already set.".into());
7678
}
7779

78-
if let Err(error) = self.data.set(Arc::clone(&client.data)) {
79-
return Err(format!("Failed to set data SetLock: {}", error).into());
80+
if self.data.set(Arc::clone(&client.data)).is_err() {
81+
error!("Could not set data OnceLock because it was already set. This should never happen.");
82+
return Err("Could not set data OnceLock because it was already set.".into());
8083
}
8184

82-
if let Err(error) = self.http.set(Arc::clone(&client.http)) {
83-
return Err(format!("Failed to set http SetLock: {}", error).into());
85+
if self.http.set(Arc::clone(&client.http)).is_err() {
86+
error!("Could not set http OnceLock because it was already set. This should never happen.");
87+
return Err("Could not set http OnceLock because it was already set.".into());
8488
}
8589

86-
if let Err(error) = self.shard_manager.set(Arc::clone(&client.shard_manager)) {
87-
return Err(format!("Failed to set shard_manager SetLock: {}", error).into());
90+
if self.shard_manager.set(Arc::clone(&client.shard_manager)).is_err() {
91+
error!("Could not set shard_manager OnceLock because it was already set. This should never happen.");
92+
return Err("Could not set shard_manager OnceLock because it was already set.".into());
8893
}
8994

9095
if let Some(voice_manager) = &client.voice_manager {
91-
if let Err(error) = self.voice_manager.set(Arc::clone(voice_manager)) {
92-
return Err(format!("Failed to set voice_manager SetLock: {}", error).into());
96+
if self.voice_manager.set(Arc::clone(voice_manager)).is_err() {
97+
error!("Could not set voice_manager OnceLock because it was already set. This should never happen.");
98+
return Err("Could not set voice_manager OnceLock because it was already set.".into());
9399
}
100+
} else {
101+
warn!("Voice manager is not available");
94102
}
95103

96-
if let Err(error) = self.ws_url.set(Arc::clone(&client.ws_url)) {
97-
return Err(format!("Failed to set ws_url SetLock: {}", error).into());
104+
if self.ws_url.set(Arc::clone(&client.ws_url)).is_err() {
105+
error!("Could not set ws_url OnceLock because it was already set. This should never happen.");
106+
return Err("Could not set ws_url OnceLock because it was already set.".into());
98107
}
99108

100109
let client_handle = spawn(async move { client.start().await });
@@ -138,12 +147,12 @@ impl Service for DiscordService {
138147
}
139148

140149
struct EventHandler {
141-
client: Arc<Mutex<SetLock<Ready>>>,
150+
client: Arc<OnceLock<Ready>>,
142151
ready_notify: Arc<Notify>,
143152
}
144153

145154
impl EventHandler {
146-
pub fn new(client: Arc<Mutex<SetLock<Ready>>>, ready_notify: Arc<Notify>) -> Self {
155+
pub fn new(client: Arc<OnceLock<Ready>>, ready_notify: Arc<Notify>) -> Self {
147156
Self { client, ready_notify }
148157
}
149158
}
@@ -152,9 +161,9 @@ impl EventHandler {
152161
impl client::EventHandler for EventHandler {
153162
async fn ready(&self, _ctx: Context, data_about_bot: Ready) {
154163
info!("Connected to Discord as {}", data_about_bot.user.tag());
155-
if let Err(error) = self.client.lock().await.set(data_about_bot) {
156-
error!("Failed to set client SetLock: {}", error);
157-
panic!("Failed to set client SetLock: {}", error);
164+
if self.client.set(data_about_bot).is_err() {
165+
error!("Could not set client OnceLock because it was already set. This should never happen.");
166+
panic!("Could not set client OnceLock because it was already set");
158167
}
159168
self.ready_notify.notify_one();
160169
}

0 commit comments

Comments
 (0)