From 2b7b5b15e614ce4a88ad6745ec4e4f2a5080b6c2 Mon Sep 17 00:00:00 2001 From: Monica Moniot Date: Mon, 21 Aug 2023 14:16:12 -0400 Subject: [PATCH] added to_components --- src/single_thread.rs | 9 ++++++++- src/sync.rs | 7 +++++++ src/tokio.rs | 11 +++++++++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/single_thread.rs b/src/single_thread.rs index 402a016..bdea3bb 100644 --- a/src/single_thread.rs +++ b/src/single_thread.rs @@ -26,6 +26,13 @@ impl<'a, TL: TransportLayer, SendData, RecvData, const CAP: usize> Rep packet_data(seq_no, self.reply_no), ); } + + pub fn to_components(mut self) -> (TL, SeqNo, bool) { + (self.app.take().unwrap(), self.reply_no, self.is_holding_lock) + } + pub unsafe fn from_components(seq: &'a mut SeqEx, app: TL, reply_no: SeqNo, is_holding_lock: bool) -> Self { + ReplyGuard { seq, app: Some(app), reply_no, is_holding_lock } + } } impl<'a, TL: TransportLayer, SendData, RecvData, const CAP: usize> Drop for ReplyGuard<'a, TL, SendData, RecvData, CAP> { fn drop(&mut self) { @@ -179,7 +186,7 @@ impl SeqEx { &mut self, mut app: impl TransportLayer, packet: Packet

, - ) -> Result, RecvError> { + ) -> Result, RecvError> { match self.receive_raw_and_direct(packet) { Ok(a) => Ok(a), Err(DirectRecvError::DroppedDuplicateResendAck(reply_no)) => { diff --git a/src/sync.rs b/src/sync.rs index 7e61539..c7b5e20 100644 --- a/src/sync.rs +++ b/src/sync.rs @@ -43,6 +43,13 @@ impl<'a, TL: TransportLayer, SendData, RecvData, const CAP: usize> Rep pub fn reply(self, seq_cst: bool, packet_data: SendData) { self.reply_with(seq_cst, |_, _| packet_data) } + + pub fn to_components(mut self) -> (TL, SeqNo, bool) { + (self.app.take().unwrap(), self.reply_no, self.is_holding_lock) + } + pub unsafe fn from_components(seq: &'a SeqExSync, app: TL, reply_no: SeqNo, is_holding_lock: bool) -> Self { + ReplyGuard { seq, app: Some(app), reply_no, is_holding_lock } + } } impl<'a, TL: TransportLayer, SendData, RecvData, const CAP: usize> Drop for ReplyGuard<'a, TL, SendData, RecvData, CAP> { fn drop(&mut self) { diff --git a/src/tokio.rs b/src/tokio.rs index f9eac5d..ee68bab 100644 --- a/src/tokio.rs +++ b/src/tokio.rs @@ -22,8 +22,8 @@ pub struct ReplyGuard<'a, TL: TokioLayer, Payload, const CAP: is_holding_lock: bool, } impl<'a, TL: TokioLayer, Payload, const CAP: usize> ReplyGuard<'a, TL, Payload, CAP> { - fn new(seq: &'a SeqExTokio, app: TL, reply_no: SeqNo, seq_cst: bool) -> Self { - ReplyGuard { seq, app: Some(app), reply_no, is_holding_lock: seq_cst } + fn new(seq: &'a SeqExTokio, app: TL, reply_no: SeqNo, is_holding_lock: bool) -> Self { + ReplyGuard { seq, app: Some(app), reply_no, is_holding_lock } } fn try_reply_with_inner(&mut self, app: TL, seq_cst: bool, packet_data: impl FnOnce(SeqNo, SeqNo) -> SendData) -> Option { let mut seq = self.seq.seq_ex.lock().unwrap(); @@ -64,6 +64,13 @@ impl<'a, TL: TokioLayer, Payload, const CAP: usize> ReplyGuar let (reply_no, seq_cst, recv_data) = rx.await.map_err(|_| AsyncError::SeqExClosed)?.ok_or(AsyncError::ReceivedAck)?; Ok((Self::new(self.seq, app, reply_no, seq_cst), recv_data)) } + + pub fn to_components(mut self) -> (TL, SeqNo, bool) { + (self.app.take().unwrap(), self.reply_no, self.is_holding_lock) + } + pub unsafe fn from_components(seq: &'a SeqExTokio, app: TL, reply_no: SeqNo, is_holding_lock: bool) -> Self { + Self::new(seq, app, reply_no, is_holding_lock) + } } impl<'a, TL: TokioLayer, Payload, const CAP: usize> Drop for ReplyGuard<'a, TL, Payload, CAP> { fn drop(&mut self) {