mirror of
https://github.com/fafhrd91/actix-net
synced 2024-12-18 02:13:58 +01:00
allow to close mpsc sender
This commit is contained in:
parent
631cb86947
commit
dded482514
@ -274,15 +274,11 @@ where
|
||||
State::Error(_) => {
|
||||
// flush write buffer
|
||||
if !self.framed.is_write_buf_empty() {
|
||||
match self.framed.flush(cx) {
|
||||
Poll::Pending => Poll::Pending,
|
||||
Poll::Ready(Ok(_)) | Poll::Ready(Err(_)) => {
|
||||
Poll::Ready(Err(self.state.take_error()))
|
||||
}
|
||||
if let Poll::Pending = self.framed.flush(cx) {
|
||||
return Poll::Pending;
|
||||
}
|
||||
} else {
|
||||
Poll::Ready(Err(self.state.take_error()))
|
||||
}
|
||||
Poll::Ready(Err(self.state.take_error()))
|
||||
}
|
||||
State::FlushAndStop => {
|
||||
if !this.framed.is_write_buf_empty() {
|
||||
|
@ -53,6 +53,14 @@ impl<T> Sender<T> {
|
||||
shared.blocked_recv.wake();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Closes the sender half
|
||||
///
|
||||
/// This prevents any further messages from being sent on the channel while
|
||||
/// still enabling the receiver to drain messages that are buffered.
|
||||
pub fn close(&mut self) {
|
||||
self.shared.get_mut().has_receiver = false;
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Clone for Sender<T> {
|
||||
@ -104,6 +112,15 @@ pub struct Receiver<T> {
|
||||
shared: Cell<Shared<T>>,
|
||||
}
|
||||
|
||||
impl<T> Receiver<T> {
|
||||
/// Create Sender
|
||||
pub fn sender(&self) -> Sender<T> {
|
||||
Sender {
|
||||
shared: self.shared.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Unpin for Receiver<T> {}
|
||||
|
||||
impl<T> Stream for Receiver<T> {
|
||||
@ -192,5 +209,11 @@ mod tests {
|
||||
tx.send("test").unwrap();
|
||||
drop(rx);
|
||||
assert!(tx.send("test").is_err());
|
||||
|
||||
let (mut tx, _) = channel();
|
||||
let tx2 = tx.clone();
|
||||
tx.close();
|
||||
assert!(tx.send("test").is_err());
|
||||
assert!(tx2.send("test").is_err());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user