提交 5075540e authored 作者: Serhij S's avatar Serhij S

notify all only when channel is closed

上级 5da096fd
use std::sync::Arc;
use crate::{pdeque::Deque, Error, DataDeliveryPolicy, Result};
use crate::{pdeque::Deque, DataDeliveryPolicy, Error, Result};
use object_id::UniqueId;
use parking_lot::{Condvar, Mutex};
......@@ -186,9 +186,12 @@ where
T: DataDeliveryPolicy,
{
fn drop(&mut self) {
self.channel.0.pc.lock().senders -= 1;
let mut pc = self.channel.0.pc.lock();
pc.senders -= 1;
if pc.senders == 0 {
self.channel.0.available.notify_all();
}
}
}
#[derive(Eq, PartialEq)]
......@@ -246,9 +249,12 @@ where
T: DataDeliveryPolicy,
{
fn drop(&mut self) {
self.channel.0.pc.lock().receivers -= 1;
let mut pc = self.channel.0.pc.lock();
pc.receivers -= 1;
if pc.receivers == 0 {
self.channel.0.available.notify_all();
}
}
}
fn make_channel<T: DataDeliveryPolicy>(ch: Channel<T>) -> (Sender<T>, Receiver<T>) {
......@@ -285,7 +291,7 @@ pub fn ordered<T: DataDeliveryPolicy>(capacity: usize) -> (Sender<T>, Receiver<T
mod test {
use std::{thread, time::Duration};
use crate::{DeliveryPolicy, DataDeliveryPolicy};
use crate::{DataDeliveryPolicy, DeliveryPolicy};
use super::bounded;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论