html terminal
use atomics instead of Mutex<u8>
| -rw-r--r-- | src/bot/mod.rs | 13 | ||||
| -rw-r--r-- | src/webhook.rs | 18 |
2 files changed, 19 insertions, 12 deletions
diff --git a/src/bot/mod.rs b/src/bot/mod.rs index eb43724..4289a4b 100644 --- a/src/bot/mod.rs +++ b/src/bot/mod.rs @@ -16,7 +16,10 @@ use serenity::http::Http; use serenity::prelude::*; use std::fs::read_to_string; use std::str::FromStr; -use std::sync::{Arc, Mutex, OnceLock}; +use std::sync::{ + atomic::{AtomicU8, Ordering}, + Arc, OnceLock, +}; use tokio::sync::broadcast; #[derive(Debug)] @@ -25,7 +28,7 @@ pub struct Data { vote_data: voting::Votes, } -static SKIPPING: OnceLock<(Arc<Mutex<u8>>, broadcast::Sender<String>)> = OnceLock::new(); +static SKIPPING: OnceLock<(Arc<AtomicU8>, broadcast::Sender<String>)> = OnceLock::new(); #[macro_export] macro_rules! send { @@ -173,9 +176,9 @@ macro_rules! return_next { async fn get_nextblock() -> String { let (skip_count, skip_send) = SKIPPING.get().unwrap(); - { - *skip_count.lock().unwrap() += 1; - } + + skip_count.fetch_add(1, Ordering::Relaxed); + skip_send .subscribe() .recv() diff --git a/src/webhook.rs b/src/webhook.rs index 9653925..71f8c79 100644 --- a/src/webhook.rs +++ b/src/webhook.rs @@ -3,13 +3,16 @@ use poise::serenity_prelude::Webhook as RealHook; use regex::Regex; use serenity::{builder::ExecuteWebhook, http::Http, json}; use std::convert::AsRef; -use std::sync::{Arc, LazyLock, Mutex}; +use std::sync::{ + atomic::{AtomicU8, Ordering}, + Arc, LazyLock, +}; use tokio::sync::broadcast::{self, error::TryRecvError}; use tokio::time::{sleep, Duration, Instant}; pub struct Webhook<'a> { pub skipped: broadcast::Sender<String>, - pub skip: Arc<Mutex<u8>>, + pub skip: Arc<AtomicU8>, inner: RealHook, http: &'a Http, } @@ -19,7 +22,7 @@ impl<'a> Webhook<'a> { Self { inner: RealHook::from_url(http, url).await.unwrap(), http: http.as_ref(), - skip: Arc::new(Mutex::new(0)), + skip: Arc::new(AtomicU8::new(0)), skipped: broadcast::channel(16).0, } } @@ -78,14 +81,15 @@ impl<'a> Webhook<'a> { } }, Ok(m) => { - let mut lock = self.skip.lock().unwrap(); - if *lock > 0 { - *lock -= 1; + if self + .skip + .fetch_update(Ordering::Relaxed, Ordering::Relaxed, |n| n.checked_sub(1)) + .is_ok() + { input!("{m} < skipped"); self.skipped.send(m).unwrap(); continue; } - drop(lock); for line in m.lines() { let line = line.to_string(); input!("{line}"); |