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

notify all only when channel is closed

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