From c87eb6bddd4c0ec85d2bb4bc2e102f96f3660fe0 Mon Sep 17 00:00:00 2001 From: tison Date: Wed, 7 May 2025 18:29:06 +0800 Subject: [PATCH 1/2] feat: release and saturating_release for SemaphorePermit Signed-off-by: tison --- mea/src/semaphore/mod.rs | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/mea/src/semaphore/mod.rs b/mea/src/semaphore/mod.rs index 4ac5120..7f81082 100644 --- a/mea/src/semaphore/mod.rs +++ b/mea/src/semaphore/mod.rs @@ -430,6 +430,34 @@ impl SemaphorePermit<'_> { self.permits = 0; } + /// Releases `n` permits back to the semaphore. + /// + /// # Panics + /// + /// Panics if `n` is greater than the number of permits held by this structure. + pub fn release(&mut self, n: usize) { + assert!( + n <= self.permits, + "release more permits ({}) than held ({})", + n, + self.permits + ); + + self.permits -= n; + self.sem.release(n); + } + + /// Releases at most `n` permits back to the semaphore. + /// + /// If `n` is greater than the number of permits held by this structure, releases + /// all the permits held by this structure. + pub fn saturating_release(&mut self, n: usize) { + let n = self.permits.min(n); + + self.permits -= n; + self.sem.release(n); + } + /// Returns the number of permits this permit holds. /// /// # Examples @@ -492,6 +520,34 @@ impl OwnedSemaphorePermit { self.permits = 0; } + /// Releases `n` permits back to the semaphore. + /// + /// # Panics + /// + /// Panics if `n` is greater than the number of permits held by this structure. + pub fn release(&mut self, n: usize) { + assert!( + n <= self.permits, + "release more permits ({}) than held ({})", + n, + self.permits + ); + + self.permits -= n; + self.sem.release(n); + } + + /// Releases at most `n` permits back to the semaphore. + /// + /// If `n` is greater than the number of permits held by this structure, releases + /// all the permits held by this structure. + pub fn saturating_release(&mut self, n: usize) { + let n = self.permits.min(n); + + self.permits -= n; + self.sem.release(n); + } + /// Returns the number of permits this permit holds. /// /// # Examples From e7ab06714748f2e521ec687cf52eaa0037aafe22 Mon Sep 17 00:00:00 2001 From: tison Date: Wed, 7 May 2025 18:51:57 +0800 Subject: [PATCH 2/2] no saturating_release Signed-off-by: tison --- mea/src/semaphore/mod.rs | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/mea/src/semaphore/mod.rs b/mea/src/semaphore/mod.rs index 7f81082..b473e5a 100644 --- a/mea/src/semaphore/mod.rs +++ b/mea/src/semaphore/mod.rs @@ -447,17 +447,6 @@ impl SemaphorePermit<'_> { self.sem.release(n); } - /// Releases at most `n` permits back to the semaphore. - /// - /// If `n` is greater than the number of permits held by this structure, releases - /// all the permits held by this structure. - pub fn saturating_release(&mut self, n: usize) { - let n = self.permits.min(n); - - self.permits -= n; - self.sem.release(n); - } - /// Returns the number of permits this permit holds. /// /// # Examples @@ -537,17 +526,6 @@ impl OwnedSemaphorePermit { self.sem.release(n); } - /// Releases at most `n` permits back to the semaphore. - /// - /// If `n` is greater than the number of permits held by this structure, releases - /// all the permits held by this structure. - pub fn saturating_release(&mut self, n: usize) { - let n = self.permits.min(n); - - self.permits -= n; - self.sem.release(n); - } - /// Returns the number of permits this permit holds. /// /// # Examples