提交 80235e41 authored 作者: Serhij S's avatar Serhij S

session changed on reconnect

上级 f0b5e6ac
...@@ -148,13 +148,12 @@ impl Communicator for Serial { ...@@ -148,13 +148,12 @@ impl Communicator for Serial {
self.busy.lock() self.busy.lock()
} }
fn session_id(&self) -> usize { fn session_id(&self) -> usize {
self.session_id.load(Ordering::Relaxed) self.session_id.load(Ordering::Acquire)
} }
fn reconnect(&self) { fn reconnect(&self) {
let mut port = self.port.lock(); let mut port = self.port.lock();
port.system_port.take(); port.system_port.take();
port.last_frame.take(); port.last_frame.take();
self.session_id.fetch_add(1, Ordering::Relaxed);
} }
fn write(&self, buf: &[u8]) -> Result<()> { fn write(&self, buf: &[u8]) -> Result<()> {
let mut port = self let mut port = self
...@@ -218,6 +217,7 @@ impl Serial { ...@@ -218,6 +217,7 @@ impl Serial {
let port = open(&self.params, self.timeout)?; let port = open(&self.params, self.timeout)?;
lock.system_port.replace(port); lock.system_port.replace(port);
lock.last_frame.take(); lock.last_frame.take();
self.session_id.fetch_add(1, Ordering::Release);
} }
Ok(lock) Ok(lock)
} }
......
...@@ -51,9 +51,8 @@ pub struct Tcp { ...@@ -51,9 +51,8 @@ pub struct Tcp {
pub type TcpClient = Arc<Tcp>; pub type TcpClient = Arc<Tcp>;
macro_rules! handle_tcp_stream_error { macro_rules! handle_tcp_stream_error {
($sess: expr, $stream: expr, $err: expr, $any: expr) => {{ ($stream: expr, $err: expr, $any: expr) => {{
if $any || $err.kind() == std::io::ErrorKind::TimedOut { if $any || $err.kind() == std::io::ErrorKind::TimedOut {
$sess.fetch_add(1, Ordering::Relaxed);
$stream.take().map(|s| s.shutdown(net::Shutdown::Both)); $stream.take().map(|s| s.shutdown(net::Shutdown::Both));
} }
$err.into() $err.into()
...@@ -65,13 +64,13 @@ impl Communicator for Tcp { ...@@ -65,13 +64,13 @@ impl Communicator for Tcp {
self.busy.lock() self.busy.lock()
} }
fn session_id(&self) -> usize { fn session_id(&self) -> usize {
self.session_id.load(Ordering::Relaxed) self.session_id.load(Ordering::Acquire)
} }
fn reconnect(&self) { fn reconnect(&self) {
self.stream.lock().take().map(|s| { self.stream
self.session_id.fetch_add(1, Ordering::Relaxed); .lock()
s.shutdown(net::Shutdown::Both) .take()
}); .map(|s| s.shutdown(net::Shutdown::Both));
} }
fn write(&self, buf: &[u8]) -> Result<()> { fn write(&self, buf: &[u8]) -> Result<()> {
let mut stream = self.get_stream()?; let mut stream = self.get_stream()?;
...@@ -79,7 +78,7 @@ impl Communicator for Tcp { ...@@ -79,7 +78,7 @@ impl Communicator for Tcp {
.as_mut() .as_mut()
.unwrap() .unwrap()
.write_all(buf) .write_all(buf)
.map_err(|e| handle_tcp_stream_error!(self.session_id, stream, e, true)) .map_err(|e| handle_tcp_stream_error!(stream, e, true))
} }
fn read_exact(&self, buf: &mut [u8]) -> Result<()> { fn read_exact(&self, buf: &mut [u8]) -> Result<()> {
let mut stream = self.get_stream()?; let mut stream = self.get_stream()?;
...@@ -87,7 +86,7 @@ impl Communicator for Tcp { ...@@ -87,7 +86,7 @@ impl Communicator for Tcp {
.as_mut() .as_mut()
.unwrap() .unwrap()
.read_exact(buf) .read_exact(buf)
.map_err(|e| handle_tcp_stream_error!(self.session_id, stream, e, false)) .map_err(|e| handle_tcp_stream_error!(stream, e, false))
} }
fn local_ip_addr(&self) -> Result<Option<SocketAddr>> { fn local_ip_addr(&self) -> Result<Option<SocketAddr>> {
let mut stream = self.get_stream()?; let mut stream = self.get_stream()?;
...@@ -96,7 +95,7 @@ impl Communicator for Tcp { ...@@ -96,7 +95,7 @@ impl Communicator for Tcp {
.unwrap() .unwrap()
.local_addr() .local_addr()
.map(Some) .map(Some)
.map_err(|e| handle_tcp_stream_error!(self.session_id, stream, e, false)) .map_err(|e| handle_tcp_stream_error!(stream, e, false))
} }
fn protocol(&self) -> Protocol { fn protocol(&self) -> Protocol {
Protocol::Tcp Protocol::Tcp
...@@ -147,6 +146,7 @@ impl Tcp { ...@@ -147,6 +146,7 @@ impl Tcp {
if let Some(ref chat) = self.chat { if let Some(ref chat) = self.chat {
chat(&mut stream).map_err(Error::io)?; chat(&mut stream).map_err(Error::io)?;
} }
self.session_id.fetch_add(1, Ordering::Release);
if let Some(ref tx) = self.reader_tx { if let Some(ref tx) = self.reader_tx {
tx.send(CommReader { tx.send(CommReader {
reader: Some(Box::new(stream.try_clone()?)), reader: Some(Box::new(stream.try_clone()?)),
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论