summaryrefslogtreecommitdiff
path: root/src/limiter.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-04-06 20:23:00 +0200
committermetamuffin <metamuffin@disroot.org>2023-04-06 20:23:00 +0200
commit56fb681279b2f2221eef933617d521469c6e6d83 (patch)
tree36e0fc43872e2af4e1c51b72e989d01698df1fde /src/limiter.rs
parentc3c3a07cae6a938534824c32573927dd7a5ece4b (diff)
downloadgnix-56fb681279b2f2221eef933617d521469c6e6d83.tar
gnix-56fb681279b2f2221eef933617d521469c6e6d83.tar.bz2
gnix-56fb681279b2f2221eef933617d521469c6e6d83.tar.zst
apply limits
Diffstat (limited to 'src/limiter.rs')
-rw-r--r--src/limiter.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/limiter.rs b/src/limiter.rs
new file mode 100644
index 0000000..97bdb5c
--- /dev/null
+++ b/src/limiter.rs
@@ -0,0 +1,37 @@
+use std::sync::{atomic::AtomicUsize, Arc};
+
+pub struct Limiter {
+ limit: usize,
+ counter: Arc<AtomicUsize>,
+}
+
+impl Limiter {
+ pub fn new(limit: usize) -> Self {
+ Limiter {
+ counter: Default::default(),
+ limit,
+ }
+ }
+ pub fn obtain(&self) -> Option<LimitLock> {
+ let c = self
+ .counter
+ .fetch_add(1, std::sync::atomic::Ordering::Relaxed);
+ if c < self.limit {
+ Some(LimitLock {
+ counter: self.counter.clone(),
+ })
+ } else {
+ None
+ }
+ }
+}
+
+pub struct LimitLock {
+ counter: Arc<AtomicUsize>,
+}
+impl Drop for LimitLock {
+ fn drop(&mut self) {
+ self.counter
+ .fetch_sub(1, std::sync::atomic::Ordering::Relaxed);
+ }
+}