提交 db3e73d1 authored 作者: Serhij S's avatar Serhij S

removed unsafe code

上级 34a0990a
...@@ -17,6 +17,7 @@ nix = { version = "0.28.0", features = ["signal"] } ...@@ -17,6 +17,7 @@ nix = { version = "0.28.0", features = ["signal"] }
object-id = "0.1.3" object-id = "0.1.3"
oneshot = { version = "0.1.6", default-features = false, features = ["std"] } oneshot = { version = "0.1.6", default-features = false, features = ["std"] }
parking_lot = "0.12.1" parking_lot = "0.12.1"
pin-project = "1.1.5"
serde = { version = "1.0.197", features = ["derive", "rc"] } serde = { version = "1.0.197", features = ["derive", "rc"] }
sysinfo = "0.30.6" sysinfo = "0.30.6"
thiserror = "1.0.57" thiserror = "1.0.57"
......
...@@ -10,6 +10,7 @@ use std::{ ...@@ -10,6 +10,7 @@ use std::{
use crate::{pdeque::Deque, DataDeliveryPolicy, Error, Result}; use crate::{pdeque::Deque, DataDeliveryPolicy, Error, Result};
use object_id::UniqueId; use object_id::UniqueId;
use parking_lot::Mutex; use parking_lot::Mutex;
use pin_project::{pin_project, pinned_drop};
type ClientId = usize; type ClientId = usize;
...@@ -166,6 +167,7 @@ where ...@@ -166,6 +167,7 @@ where
} }
} }
#[pin_project(PinnedDrop)]
struct Send<'a, T: DataDeliveryPolicy> { struct Send<'a, T: DataDeliveryPolicy> {
id: UniqueId, id: UniqueId,
channel: &'a Channel<T>, channel: &'a Channel<T>,
...@@ -173,8 +175,10 @@ struct Send<'a, T: DataDeliveryPolicy> { ...@@ -173,8 +175,10 @@ struct Send<'a, T: DataDeliveryPolicy> {
value: Option<T>, value: Option<T>,
} }
impl<'a, T: DataDeliveryPolicy> Drop for Send<'a, T> { #[pinned_drop]
fn drop(&mut self) { #[allow(clippy::needless_lifetimes)]
impl<'a, T: DataDeliveryPolicy> PinnedDrop for Send<'a, T> {
fn drop(self: Pin<&mut Self>) {
self.channel self.channel
.0 .0
.pc .pc
...@@ -196,11 +200,10 @@ where ...@@ -196,11 +200,10 @@ where
if pc.receivers == 0 { if pc.receivers == 0 {
return Poll::Ready(Err(Error::ChannelClosed)); return Poll::Ready(Err(Error::ChannelClosed));
} }
let this = unsafe { self.as_mut().get_unchecked_mut() }; if pc.send_fut_wakers.is_empty() || self.queued {
if pc.send_fut_wakers.is_empty() || this.queued { let push_result = pc.queue.try_push(self.value.take().unwrap());
let push_result = pc.queue.try_push(this.value.take().unwrap());
if let Some(val) = push_result.value { if let Some(val) = push_result.value {
this.value = Some(val); self.value = Some(val);
} else { } else {
pc.notify_data_sent(); pc.notify_data_sent();
return Poll::Ready(if push_result.pushed { return Poll::Ready(if push_result.pushed {
...@@ -210,7 +213,7 @@ where ...@@ -210,7 +213,7 @@ where
}); });
} }
} }
this.queued = true; self.queued = true;
pc.append_send_fut_waker(cx.waker().clone(), self.id.as_usize()); pc.append_send_fut_waker(cx.waker().clone(), self.id.as_usize());
Poll::Pending Poll::Pending
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论