Skip to content

Commit 0609a85

Browse files
authored
Revert "refactor: split serial port into separate r/w mutexes" (#331)
Revert "refactor: split serial port into separate r/w mutexes (#329)" This reverts commit efb6fed.
1 parent efb6fed commit 0609a85

3 files changed

Lines changed: 18 additions & 24 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
deploy:
1010
runs-on: ubuntu-latest
1111
steps:
12-
- uses: actions/checkout@v4
12+
- uses: actions/checkout@master
1313
with:
1414
fetch-depth: 0
1515
ref: ${{ github.event.repository.default_branch }}

.github/workflows/test.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ jobs:
66
formatting:
77
runs-on: ubuntu-latest
88
steps:
9-
- uses: actions/checkout@v4
9+
- uses: actions/checkout@master
1010
- uses: dtolnay/rust-toolchain@stable
1111
with:
1212
components: rustfmt
@@ -16,7 +16,7 @@ jobs:
1616
linting:
1717
runs-on: ubuntu-latest
1818
steps:
19-
- uses: actions/checkout@v4
19+
- uses: actions/checkout@master
2020
- uses: dtolnay/rust-toolchain@master
2121
with:
2222
toolchain: nightly-2024-09-10
@@ -32,15 +32,15 @@ jobs:
3232
dialect: ["ardupilotmega", "asluav", "matrixpilot", "minimal", "paparazzi", "python_array_test", "standard", "test", "ualberta", "uavionix", "icarous", "common", "storm32", "csairlink", "loweheiser"]
3333
signing: ["", "--features signing"]
3434
steps:
35-
- uses: actions/checkout@v4
35+
- uses: actions/checkout@master
3636
- uses: dtolnay/rust-toolchain@stable
3737
- name: Run internal tests
3838
run: cargo test --verbose --features ${{ matrix.dialect }} ${{ matrix.signing }} -- --nocapture
3939

4040
mavlink-dump:
4141
runs-on: ubuntu-latest
4242
steps:
43-
- uses: actions/checkout@v4
43+
- uses: actions/checkout@master
4444
- uses: dtolnay/rust-toolchain@stable
4545
- name: Build mavlink-dump
4646
run: cargo build --verbose --example mavlink-dump
@@ -51,7 +51,7 @@ jobs:
5151
matrix:
5252
features: ["", "--features serde,tokio-1", "--features signing"]
5353
steps:
54-
- uses: actions/checkout@v4
54+
- uses: actions/checkout@master
5555
- name: Get MSRV from Cargo.toml
5656
run: |
5757
MSRV=$(grep 'rust-version' Cargo.toml | sed 's/.*= *"\(.*\)".*/\1/')
@@ -100,7 +100,7 @@ jobs:
100100
steps:
101101
- name: Building ${{ matrix.TARGET }}
102102
run: echo "${{ matrix.TARGET }}"
103-
- uses: actions/checkout@v4
103+
- uses: actions/checkout@master
104104
- uses: dtolnay/rust-toolchain@stable
105105
with:
106106
target: ${{ matrix.TARGET }}
@@ -114,7 +114,7 @@ jobs:
114114
needs: build
115115
runs-on: ubuntu-latest
116116
steps:
117-
- uses: actions/checkout@v4
117+
- uses: actions/checkout@master
118118
- uses: dtolnay/rust-toolchain@nightly
119119
with:
120120
target: thumbv7em-none-eabihf
@@ -125,7 +125,7 @@ jobs:
125125
needs: internal-tests
126126
runs-on: ubuntu-latest
127127
steps:
128-
- uses: actions/checkout@v4
128+
- uses: actions/checkout@master
129129
- uses: dtolnay/rust-toolchain@nightly
130130
- name: Build docs
131131
run: cargo doc --features "default all-dialects emit-description emit-extensions format-generated-code tokio-1 signing"

mavlink-core/src/connection/direct_serial.rs

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ use crate::{read_versioned_msg_signed, write_versioned_msg_signed, SigningConfig
2020
use super::Connectable;
2121

2222
pub struct SerialConnection {
23-
// Separate ports for reading and writing as it's safe to use concurrently.
24-
// See the official ref: https://github.com/serialport/serialport-rs/blob/321f85e1886eaa1302aef8a600a631bc1c88703a/examples/duplex.rs
25-
read_port: Mutex<PeekReader<Box<dyn SerialPort>>>,
26-
write_port: Mutex<Box<dyn SerialPort>>,
23+
port: Mutex<PeekReader<Box<dyn SerialPort>>>,
2724
sequence: AtomicU8,
2825
protocol_version: MavlinkVersion,
2926
recv_any_version: bool,
@@ -33,7 +30,7 @@ pub struct SerialConnection {
3330

3431
impl<M: Message> MavConnection<M> for SerialConnection {
3532
fn recv(&self) -> Result<(MavHeader, M), MessageReadError> {
36-
let mut port = self.read_port.lock().unwrap();
33+
let mut port = self.port.lock().unwrap();
3734
loop {
3835
let version = ReadVersion::from_conn_cfg::<_, M>(self);
3936
#[cfg(not(feature = "signing"))]
@@ -70,20 +67,20 @@ impl<M: Message> MavConnection<M> for SerialConnection {
7067
}
7168

7269
fn send(&self, header: &MavHeader, data: &M) -> Result<usize, MessageWriteError> {
73-
let mut port = self.write_port.lock().unwrap();
70+
let mut port = self.port.lock().unwrap();
7471

7572
let sequence = self.sequence.fetch_add(
7673
1,
7774
// Safety:
7875
//
7976
// We are using `Ordering::Relaxed` here because:
8077
// - We only need a unique sequence number per message
81-
// - `Mutex` on `self.write_port` already makes sure the rest of the code is synchronized
78+
// - `Mutex` on `self.port` already makes sure the rest of the code is synchronized
8279
// - No other thread reads or writes `self.sequence` without going through this `Mutex`
8380
//
8481
// Warning:
8582
//
86-
// If we later change this code to access `self.sequence` without locking `self.write_port` with the `Mutex`,
83+
// If we later change this code to access `self.sequence` without locking `self.port` with the `Mutex`,
8784
// then we should upgrade this ordering to `Ordering::SeqCst`.
8885
atomic::Ordering::Relaxed,
8986
);
@@ -95,10 +92,10 @@ impl<M: Message> MavConnection<M> for SerialConnection {
9592
};
9693

9794
#[cfg(not(feature = "signing"))]
98-
let result = write_versioned_msg(port.deref_mut(), self.protocol_version, header, data);
95+
let result = write_versioned_msg(port.reader_mut(), self.protocol_version, header, data);
9996
#[cfg(feature = "signing")]
10097
let result = write_versioned_msg_signed(
101-
port.deref_mut(),
98+
port.reader_mut(),
10299
self.protocol_version,
103100
header,
104101
data,
@@ -131,18 +128,15 @@ impl<M: Message> MavConnection<M> for SerialConnection {
131128

132129
impl Connectable for SerialConnectable {
133130
fn connect<M: Message>(&self) -> io::Result<Box<dyn MavConnection<M> + Sync + Send>> {
134-
let read_port = serialport::new(&self.port_name, self.baud_rate)
131+
let port = serialport::new(&self.port_name, self.baud_rate)
135132
.data_bits(DataBits::Eight)
136133
.parity(Parity::None)
137134
.stop_bits(StopBits::One)
138135
.flow_control(FlowControl::None)
139136
.open()?;
140137

141-
let write_port = read_port.try_clone()?;
142-
143138
Ok(Box::new(SerialConnection {
144-
read_port: Mutex::new(PeekReader::new(read_port)),
145-
write_port: Mutex::new(write_port),
139+
port: Mutex::new(PeekReader::new(port)),
146140
sequence: AtomicU8::new(0),
147141
protocol_version: MavlinkVersion::V2,
148142
#[cfg(feature = "signing")]

0 commit comments

Comments
 (0)