Skip to content

Commit d02f454

Browse files
committed
fix: 修改 Register trait 中 read_byte 方法的可变性,优化 Serial 结构体的内存管理
1 parent 80941c0 commit d02f454

2 files changed

Lines changed: 14 additions & 13 deletions

File tree

interface/rdif-serial/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ impl Config {
175175
pub trait Register: Send + Sync + Any + 'static {
176176
// ==================== 基础数据传输 ====================
177177
fn write_byte(&mut self, byte: u8);
178-
fn read_byte(&self) -> Result<u8, RegisterTransferError>;
178+
fn read_byte(&mut self) -> Result<u8, RegisterTransferError>;
179179

180180
// ==================== 配置管理 ====================
181181
fn set_config(&mut self, config: &Config) -> Result<(), ConfigError>;

interface/rdif-serial/src/serial.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,32 @@ use rdif_base::{DriverGeneric, KError};
99
use crate::{InterruptMask, Register, TransferError};
1010

1111
pub struct Serial<T: Register> {
12-
inner: Arc<UnsafeCell<T>>,
12+
inner: Arc<Inner<T>>,
1313
is_tx_taken: Arc<AtomicBool>,
1414
is_rx_taken: Arc<AtomicBool>,
1515
is_irq_handler_taken: Arc<AtomicBool>,
1616
}
1717

18-
unsafe impl<T: Register> Send for Serial<T> {}
19-
unsafe impl<T: Register> Sync for Serial<T> {}
18+
struct Inner<T: Register>(UnsafeCell<T>);
19+
unsafe impl<T: Register> Send for Inner<T> {}
20+
unsafe impl<T: Register> Sync for Inner<T> {}
2021

2122
impl<T: Register> Serial<T> {
2223
pub fn new(inner: T) -> Self {
2324
Self {
24-
inner: Arc::new(UnsafeCell::new(inner)),
25+
inner: Arc::new(Inner(UnsafeCell::new(inner))),
2526
is_tx_taken: Arc::new(AtomicBool::new(false)),
2627
is_rx_taken: Arc::new(AtomicBool::new(false)),
2728
is_irq_handler_taken: Arc::new(AtomicBool::new(false)),
2829
}
2930
}
3031

3132
fn inner_mut(&mut self) -> &mut T {
32-
unsafe { &mut *self.inner.get() }
33+
unsafe { &mut *self.inner.0.get() }
3334
}
3435

3536
fn inner(&self) -> &T {
36-
unsafe { &*self.inner.get() }
37+
unsafe { &*self.inner.0.get() }
3738
}
3839

3940
pub fn open(&mut self) -> Result<(), KError> {
@@ -161,7 +162,7 @@ impl<T: Register> DriverGeneric for Serial<T> {
161162
}
162163

163164
pub struct Sender<T: Register> {
164-
s: Weak<UnsafeCell<T>>,
165+
s: Weak<Inner<T>>,
165166
b: Arc<AtomicBool>,
166167
}
167168

@@ -176,13 +177,13 @@ impl<T: Register> Drop for Sender<T> {
176177
impl<T: Register> crate::TSender for Sender<T> {
177178
fn send(&mut self, buf: &[u8]) -> Result<usize, TransferError> {
178179
let s = self.s.upgrade().ok_or(TransferError::SerialReleased)?;
179-
let s = unsafe { &mut *s.get() };
180+
let s = unsafe { &mut *s.0.get() };
180181
Ok(s.write_buf(buf))
181182
}
182183
}
183184

184185
pub struct Reciever<T: Register> {
185-
s: Weak<UnsafeCell<T>>,
186+
s: Weak<Inner<T>>,
186187
b: Arc<AtomicBool>,
187188
}
188189

@@ -191,7 +192,7 @@ unsafe impl<T: Register> Send for Reciever<T> {}
191192
impl<T: Register> crate::TReciever for Reciever<T> {
192193
fn recive(&mut self, buf: &mut [u8]) -> Result<usize, TransferError> {
193194
let s = self.s.upgrade().ok_or(TransferError::SerialReleased)?;
194-
let s = unsafe { &mut *s.get() };
195+
let s = unsafe { &mut *s.0.get() };
195196
Ok(s.read_buf(buf)?)
196197
}
197198
fn clean_fifo(&mut self) {
@@ -211,15 +212,15 @@ impl<T: Register> Drop for Reciever<T> {
211212
}
212213

213214
pub struct IrqHandler<T: Register> {
214-
s: Arc<UnsafeCell<T>>,
215+
s: Arc<Inner<T>>,
215216
b: Arc<AtomicBool>,
216217
}
217218
unsafe impl<T: Register> Send for IrqHandler<T> {}
218219
unsafe impl<T: Register> Sync for IrqHandler<T> {}
219220

220221
impl<T: Register> crate::TIrqHandler for IrqHandler<T> {
221222
fn clean_interrupt_status(&self) -> InterruptMask {
222-
let s = unsafe { &mut *self.s.get() };
223+
let s = unsafe { &mut *self.s.0.get() };
223224
s.clean_interrupt_status()
224225
}
225226
}

0 commit comments

Comments
 (0)