diff --git a/src/lib.rs b/src/lib.rs index 271b9b2..8eca8df 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -370,11 +370,13 @@ impl Channel { } } - /// Obtain the requester end of the channel if it hasn't been taken yet + /// Obtain the requester end of the channel if it hasn't been taken yet. + /// + /// Can be called again if the previously obtained [`Requester`](Requester) has been dropped pub fn requester(&self) -> Option> { if self .requester_claimed - .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst) + .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) .is_ok() { Some(Requester { channel: self }) @@ -383,11 +385,13 @@ impl Channel { } } - /// Obtain the responder end of the channel if it hasn't been taken yet + /// Obtain the responder end of the channel if it hasn't been taken yet. + /// + /// Can be called again if the previously obtained [`Responder`](Responder) has been dropped pub fn responder(&self) -> Option> { if self .responder_claimed - .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst) + .compare_exchange(false, true, Ordering::Relaxed, Ordering::Relaxed) .is_ok() { Some(Responder { channel: self }) @@ -396,7 +400,9 @@ impl Channel { } } - /// Obtain both the requester and responder ends of the channel + /// Obtain both the requester and responder ends of the channel. + /// + /// Can be called again if the previously obtained [`Responder`](Responder) and [`Requester`](Requester) have been dropped pub fn split(&self) -> Option<(Requester<'_, Q, A>, Responder<'_, Q, A>)> { Some((self.requester()?, self.responder()?)) } @@ -890,7 +896,7 @@ impl Interchange { /// Claim one of the channels of the interchange. Returns None if called more than `N` times. pub fn claim(&self) -> Option<(Requester, Responder)> { - let index = self.last_claimed.fetch_add(1, Ordering::SeqCst); + let index = self.last_claimed.fetch_add(1, Ordering::Relaxed); for i in (index % N)..N { let tmp = self.channels[i].split();