fix: switch to async read-write lock instead of sync mutex in call handler to try to prevent deadlock
This commit is contained in:
15
src/call.rs
15
src/call.rs
@@ -11,11 +11,9 @@ use songbird::{
|
||||
CoreEvent, Event, EventContext, EventHandler, Songbird,
|
||||
driver::{Channels, SampleRate},
|
||||
};
|
||||
use std::{
|
||||
sync::{Arc, Mutex},
|
||||
time::Instant,
|
||||
};
|
||||
use std::{sync::Arc, time::Instant};
|
||||
use time::UtcDateTime;
|
||||
use tokio::sync::RwLock;
|
||||
use twilight_model::id::{
|
||||
Id,
|
||||
marker::{ChannelMarker, GuildMarker, UserMarker},
|
||||
@@ -31,7 +29,7 @@ struct Handler {
|
||||
guild_id: Id<GuildMarker>,
|
||||
channel_id: Id<ChannelMarker>,
|
||||
|
||||
known_ssrcs: Arc<Mutex<OneToManyUniqueBTreeMap<Id<UserMarker>, u32>>>,
|
||||
known_ssrcs: Arc<RwLock<OneToManyUniqueBTreeMap<Id<UserMarker>, u32>>>,
|
||||
|
||||
audio_channels: u16,
|
||||
audio_sample_rate: u32,
|
||||
@@ -53,15 +51,15 @@ impl EventHandler for Handler {
|
||||
let user_id = Id::new(user_id.0);
|
||||
|
||||
self.known_ssrcs
|
||||
.lock()
|
||||
.unwrap()
|
||||
.write()
|
||||
.await
|
||||
.insert(user_id, speaking.ssrc);
|
||||
}
|
||||
}
|
||||
EventContext::VoiceTick(voice_tick) => {
|
||||
for (ssrc, voice_data) in &voice_tick.speaking {
|
||||
let user_id = {
|
||||
let known_ssrcs = self.known_ssrcs.lock().unwrap();
|
||||
let known_ssrcs = self.known_ssrcs.read().await;
|
||||
known_ssrcs.get_left_for(ssrc).cloned()
|
||||
};
|
||||
|
||||
@@ -126,7 +124,6 @@ impl EventHandler for Handler {
|
||||
let channels = self.audio_channels;
|
||||
let sample_rate = self.audio_sample_rate;
|
||||
|
||||
|
||||
let recording_manager = self.recording_manager.clone();
|
||||
let samples = pcm.clone();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user