html terminal
use atomics instead of Mutex<u8>
bendn 2023-07-25
parent 1a03c79 · commit 25d3588
-rw-r--r--src/bot/mod.rs13
-rw-r--r--src/webhook.rs18
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}");