Skip to content

Commit bbaef4a

Browse files
committed
change internal structure from Mutex<RefCell<>> to Arc<Mutex<<>>
1 parent 1a0f28f commit bbaef4a

File tree

5 files changed

+52
-49
lines changed

5 files changed

+52
-49
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
### Added
99
- Added re-exports for `libftd2xx` and `ftdi` when the respective feature is used.
1010

11+
### Changed
12+
- Changed the internal shared FTDI type from `Mutex<RefCell<FtInner<Device>>>` to `Arc<Mutex<FtInner<Device>>>`.
13+
1114
## [0.11.0] - 2022-01-18
1215
### Added
1316
- Added support for input pins.

src/gpio.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::error::Error;
22
use crate::{FtInner, PinUse};
33
use ftdi_mpsse::{MpsseCmdBuilder, MpsseCmdExecutor};
4-
use std::result::Result;
5-
use std::{cell::RefCell, sync::Mutex};
4+
use std::borrow::BorrowMut;
5+
use std::sync::{Arc, Mutex};
66

77
/// FTDI output pin.
88
///
@@ -13,7 +13,7 @@ use std::{cell::RefCell, sync::Mutex};
1313
#[derive(Debug)]
1414
pub struct OutputPin<'a, Device: MpsseCmdExecutor> {
1515
/// Parent FTDI device.
16-
mtx: &'a Mutex<RefCell<FtInner<Device>>>,
16+
mtx: &'a Arc<Mutex<FtInner<Device>>>,
1717
/// GPIO pin index. 0-7 for the FT232H.
1818
idx: u8,
1919
}
@@ -25,11 +25,11 @@ where
2525
Error<E>: From<E>,
2626
{
2727
pub(crate) fn new(
28-
mtx: &'a Mutex<RefCell<FtInner<Device>>>,
28+
mtx: &'a Arc<Mutex<FtInner<Device>>>,
2929
idx: u8,
3030
) -> Result<OutputPin<'a, Device>, Error<E>> {
31-
let lock = mtx.lock().expect("Failed to aquire FTDI mutex");
32-
let mut inner = lock.borrow_mut();
31+
let mut lock = mtx.lock().expect("Failed to aquire FTDI mutex");
32+
let inner = lock.borrow_mut();
3333
inner.direction |= 1 << idx;
3434
inner.allocate_pin(idx, PinUse::Output);
3535
let cmd: MpsseCmdBuilder = MpsseCmdBuilder::new()
@@ -40,8 +40,8 @@ where
4040
}
4141

4242
pub(crate) fn set(&self, state: bool) -> Result<(), Error<E>> {
43-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
44-
let mut inner = lock.borrow_mut();
43+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
44+
let inner = lock.borrow_mut();
4545

4646
if state {
4747
inner.value |= self.mask();
@@ -91,7 +91,7 @@ where
9191
#[derive(Debug)]
9292
pub struct InputPin<'a, Device: MpsseCmdExecutor> {
9393
/// Parent FTDI device.
94-
mtx: &'a Mutex<RefCell<FtInner<Device>>>,
94+
mtx: &'a Arc<Mutex<FtInner<Device>>>,
9595
/// GPIO pin index. 0-7 for the FT232H.
9696
idx: u8,
9797
}
@@ -103,11 +103,11 @@ where
103103
Error<E>: From<E>,
104104
{
105105
pub(crate) fn new(
106-
mtx: &'a Mutex<RefCell<FtInner<Device>>>,
106+
mtx: &'a Arc<Mutex<FtInner<Device>>>,
107107
idx: u8,
108108
) -> Result<InputPin<'a, Device>, Error<E>> {
109-
let lock = mtx.lock().expect("Failed to aquire FTDI mutex");
110-
let mut inner = lock.borrow_mut();
109+
let mut lock = mtx.lock().expect("Failed to aquire FTDI mutex");
110+
let inner = lock.borrow_mut();
111111
inner.direction &= !(1 << idx);
112112
inner.allocate_pin(idx, PinUse::Input);
113113
let cmd: MpsseCmdBuilder = MpsseCmdBuilder::new()
@@ -118,8 +118,8 @@ where
118118
}
119119

120120
pub(crate) fn get(&self) -> Result<bool, Error<E>> {
121-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
122-
let mut inner = lock.borrow_mut();
121+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
122+
let inner = lock.borrow_mut();
123123

124124
let mut buffer = [0u8; 1];
125125
let cmd: MpsseCmdBuilder = MpsseCmdBuilder::new().gpio_lower().send_immediate();

src/i2c.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use crate::error::Error;
22
use crate::error::ErrorKind::I2cNoAck;
33
use crate::{FtInner, PinUse};
44
use ftdi_mpsse::{ClockBitsIn, ClockBitsOut, MpsseCmdBuilder, MpsseCmdExecutor};
5-
use std::result::Result;
6-
use std::{cell::RefCell, sync::Mutex};
5+
use std::borrow::BorrowMut;
6+
use std::sync::{Arc, Mutex};
77

88
/// SCL bitmask
99
const SCL: u8 = 1 << 0;
@@ -21,7 +21,7 @@ const BITS_OUT: ClockBitsOut = ClockBitsOut::MsbNeg;
2121
#[derive(Debug)]
2222
pub struct I2c<'a, Device: MpsseCmdExecutor> {
2323
/// Parent FTDI device.
24-
mtx: &'a Mutex<RefCell<FtInner<Device>>>,
24+
mtx: &'a Arc<Mutex<FtInner<Device>>>,
2525
/// Length of the start, repeated start, and stop conditions.
2626
///
2727
/// The units for these are dimensionless number of MPSSE commands.
@@ -37,9 +37,9 @@ where
3737
E: std::error::Error,
3838
Error<E>: From<E>,
3939
{
40-
pub(crate) fn new(mtx: &Mutex<RefCell<FtInner<Device>>>) -> Result<I2c<Device>, Error<E>> {
41-
let lock = mtx.lock().expect("Failed to aquire FTDI mutex");
42-
let mut inner = lock.borrow_mut();
40+
pub(crate) fn new(mtx: &Arc<Mutex<FtInner<Device>>>) -> Result<I2c<Device>, Error<E>> {
41+
let mut lock = mtx.lock().expect("Failed to aquire FTDI mutex");
42+
let inner = lock.borrow_mut();
4343
inner.allocate_pin(0, PinUse::I2c);
4444
inner.allocate_pin(1, PinUse::I2c);
4545
inner.allocate_pin(2, PinUse::I2c);
@@ -127,8 +127,8 @@ where
127127
fn read_fast(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Error<E>> {
128128
assert!(!buffer.is_empty(), "buffer must be a non-empty slice");
129129

130-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
131-
let mut inner = lock.borrow_mut();
130+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
131+
let inner = lock.borrow_mut();
132132

133133
// ST
134134
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();
@@ -198,8 +198,8 @@ where
198198
fn read_slow(&mut self, address: u8, buffer: &mut [u8]) -> Result<(), Error<E>> {
199199
assert!(!buffer.is_empty(), "buffer must be a non-empty slice");
200200

201-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
202-
let mut inner = lock.borrow_mut();
201+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
202+
let inner = lock.borrow_mut();
203203

204204
// ST
205205
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();
@@ -272,8 +272,8 @@ where
272272
fn write_fast(&mut self, addr: u8, bytes: &[u8]) -> Result<(), Error<E>> {
273273
assert!(!bytes.is_empty(), "bytes must be a non-empty slice");
274274

275-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
276-
let mut inner = lock.borrow_mut();
275+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
276+
let inner = lock.borrow_mut();
277277
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();
278278

279279
// ST
@@ -333,8 +333,8 @@ where
333333
fn write_slow(&mut self, addr: u8, bytes: &[u8]) -> Result<(), Error<E>> {
334334
assert!(!bytes.is_empty(), "bytes must be a non-empty slice");
335335

336-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
337-
let mut inner = lock.borrow_mut();
336+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
337+
let inner = lock.borrow_mut();
338338

339339
// ST
340340
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();
@@ -414,8 +414,8 @@ where
414414

415415
// lock at the start to prevent GPIO from being modified while we build
416416
// the MPSSE command
417-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
418-
let mut inner = lock.borrow_mut();
417+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
418+
let inner = lock.borrow_mut();
419419

420420
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();
421421

@@ -522,8 +522,8 @@ where
522522

523523
// lock at the start to prevent GPIO from being modified while we build
524524
// the MPSSE command
525-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
526-
let mut inner = lock.borrow_mut();
525+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
526+
let inner = lock.borrow_mut();
527527

528528
// ST
529529
let mut mpsse_cmd: MpsseCmdBuilder = MpsseCmdBuilder::new();

src/lib.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ pub use i2c::I2c;
164164
pub use spi::Spi;
165165

166166
use ftdi_mpsse::{MpsseCmdExecutor, MpsseSettings};
167-
use std::{cell::RefCell, sync::Mutex};
167+
use std::sync::{Arc, Mutex};
168168

169169
/// State tracker for each pin on the FTDI chip.
170170
#[derive(Debug, Clone, Copy)]
@@ -228,7 +228,7 @@ impl<Device: MpsseCmdExecutor> From<Device> for FtInner<Device> {
228228
/// FTxxx device.
229229
#[derive(Debug)]
230230
pub struct FtHal<Device: MpsseCmdExecutor> {
231-
mtx: Mutex<RefCell<FtInner<Device>>>,
231+
mtx: Arc<Mutex<FtInner<Device>>>,
232232
}
233233

234234
impl<Device, E> FtHal<Device>
@@ -333,7 +333,7 @@ where
333333
device.init(mpsse_settings)?;
334334

335335
Ok(FtHal {
336-
mtx: Mutex::new(RefCell::new(device.into())),
336+
mtx: Arc::new(Mutex::new(device.into())),
337337
})
338338
}
339339
}

src/spi.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use crate::error::Error;
22
use crate::{FtInner, PinUse};
33
use embedded_hal::spi::Polarity;
44
use ftdi_mpsse::{ClockData, ClockDataOut, MpsseCmdBuilder, MpsseCmdExecutor};
5-
use std::result::Result;
6-
use std::{cell::RefCell, sync::Mutex};
5+
use std::borrow::BorrowMut;
6+
use std::sync::{Arc, Mutex};
77

88
/// FTDI SPI interface.
99
///
@@ -13,7 +13,7 @@ use std::{cell::RefCell, sync::Mutex};
1313
#[derive(Debug)]
1414
pub struct Spi<'a, Device: MpsseCmdExecutor> {
1515
/// Parent FTDI device.
16-
mtx: &'a Mutex<RefCell<FtInner<Device>>>,
16+
mtx: &'a Arc<Mutex<FtInner<Device>>>,
1717
/// MPSSE command used to clock data in and out simultaneously.
1818
///
1919
/// This is set by [`Spi::set_clock_polarity`].
@@ -30,9 +30,9 @@ where
3030
E: std::error::Error,
3131
Error<E>: From<E>,
3232
{
33-
pub(crate) fn new(mtx: &Mutex<RefCell<FtInner<Device>>>) -> Result<Spi<Device>, Error<E>> {
34-
let lock = mtx.lock().expect("Failed to aquire FTDI mutex");
35-
let mut inner = lock.borrow_mut();
33+
pub(crate) fn new(mtx: &Arc<Mutex<FtInner<Device>>>) -> Result<Spi<Device>, Error<E>> {
34+
let mut lock = mtx.lock().expect("Failed to aquire FTDI mutex");
35+
let inner = lock.borrow_mut();
3636
inner.allocate_pin(0, PinUse::Spi);
3737
inner.allocate_pin(1, PinUse::Spi);
3838
inner.allocate_pin(2, PinUse::Spi);
@@ -101,8 +101,8 @@ where
101101
.clock_data_out(self.clk_out, words)
102102
.send_immediate();
103103

104-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
105-
let mut inner = lock.borrow_mut();
104+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
105+
let inner = lock.borrow_mut();
106106

107107
inner.ft.send(cmd.as_slice())?;
108108

@@ -123,8 +123,8 @@ where
123123
.clock_data(self.clk, words)
124124
.send_immediate();
125125

126-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
127-
let mut inner = lock.borrow_mut();
126+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
127+
let inner = lock.borrow_mut();
128128
inner.ft.send(cmd.as_slice())?;
129129
inner.ft.recv(words)?;
130130

@@ -146,8 +146,8 @@ where
146146
.clock_data(self.clk, &buf)
147147
.send_immediate();
148148

149-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
150-
let mut inner = lock.borrow_mut();
149+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
150+
let inner = lock.borrow_mut();
151151

152152
match inner.ft.xfer(cmd.as_slice(), &mut buf) {
153153
Ok(()) => Ok(buf[0]),
@@ -160,8 +160,8 @@ where
160160
.clock_data_out(self.clk_out, &[byte])
161161
.send_immediate();
162162

163-
let lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
164-
let mut inner = lock.borrow_mut();
163+
let mut lock = self.mtx.lock().expect("Failed to aquire FTDI mutex");
164+
let inner = lock.borrow_mut();
165165

166166
match inner.ft.send(cmd.as_slice()) {
167167
Ok(()) => Ok(()),

0 commit comments

Comments
 (0)