Skip to content

Commit

Permalink
Move locking into RawQueue
Browse files Browse the repository at this point in the history
  • Loading branch information
bjoernQ committed Oct 23, 2024
1 parent d53136f commit 3c39057
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 47 deletions.
29 changes: 12 additions & 17 deletions esp-wifi/src/ble/btdm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,10 +191,9 @@ unsafe extern "C" fn queue_send(queue: *const (), item: *const (), _block_time_m
item as u32,
_block_time_ms
);
critical_section::with(|_| {
let queue = queue as *mut RawQueue;
(*queue).enqueue(item as *mut _)
})

let queue = queue as *mut RawQueue;
(*queue).enqueue(item as *mut _)
}

#[ram]
Expand Down Expand Up @@ -224,19 +223,15 @@ unsafe extern "C" fn queue_recv(queue: *const (), item: *const (), block_time_ms
let item = item as *mut _;

loop {
let res = critical_section::with(|_| {
memory_fence();

critical_section::with(|_cs| {
let queue = queue as *mut RawQueue;
if (*queue).try_dequeue(item) {
trace!("received from queue");
1
} else {
0
}
})
});
let res = {
let queue = queue as *mut RawQueue;
if (*queue).try_dequeue(item) {
trace!("received from queue");
1
} else {
0
}
};

if res == 1 {
trace!("queue_recv returns");
Expand Down
2 changes: 1 addition & 1 deletion esp-wifi/src/ble/npl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -947,7 +947,7 @@ unsafe extern "C" fn ble_npl_eventq_deinit(queue: *const ble_npl_eventq) {
panic!("Trying to deinitialize an uninitialized queue");
} else {
let raw_queue = (*queue).dummy as *mut RawQueue;
(*raw_queue).free_storage();
(*raw_queue).release_storage();
crate::compat::malloc::free(raw_queue.cast());
(*queue).dummy = 0;
}
Expand Down
65 changes: 36 additions & 29 deletions esp-wifi/src/compat/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,46 +47,53 @@ impl RawQueue {
}
}

pub(crate) fn free_storage(&mut self) {
pub(crate) fn release_storage(&mut self) {
unsafe {
free(self.storage);
}
self.storage = core::ptr::null_mut();
}

pub(crate) fn enqueue(&mut self, item: *mut c_void) -> i32 {
if self.count() < self.count {
unsafe {
let p = self.storage.byte_add(self.item_size * self.current_write);
p.copy_from(item as *mut u8, self.item_size);
self.current_write = (self.current_write + 1) % self.count;
}
critical_section::with(|_| {
if self.count() < self.count {
unsafe {
let p = self.storage.byte_add(self.item_size * self.current_write);
p.copy_from(item as *mut u8, self.item_size);
self.current_write = (self.current_write + 1) % self.count;
}

1
} else {
0
}
1
} else {
0
}
})
}

pub(crate) fn try_dequeue(&mut self, item: *mut c_void) -> bool {
if self.count() > 0 {
unsafe {
let p = self.storage.byte_add(self.item_size * self.current_read) as *const c_void;
item.copy_from(p, self.item_size);
self.current_read = (self.current_read + 1) % self.count;
critical_section::with(|_| {
if self.count() > 0 {
unsafe {
let p =
self.storage.byte_add(self.item_size * self.current_read) as *const c_void;
item.copy_from(p, self.item_size);
self.current_read = (self.current_read + 1) % self.count;
}
true
} else {
false
}
true
} else {
false
}
})
}

pub(crate) fn count(&self) -> usize {
if self.current_write >= self.current_read {
self.current_write - self.current_read
} else {
self.count - self.current_read + self.current_write
}
critical_section::with(|_| {
if self.current_write >= self.current_read {
self.current_write - self.current_read
} else {
self.count - self.current_read + self.current_write
}
})
}
}

Expand Down Expand Up @@ -267,7 +274,7 @@ pub(crate) fn delete_queue(queue: *mut c_void) {

let queue: *mut RawQueue = queue.cast();
unsafe {
(*queue).free_storage();
(*queue).release_storage();
free(queue.cast());
}
}
Expand All @@ -281,7 +288,7 @@ pub(crate) fn send_queued(queue: *mut c_void, item: *mut c_void, block_time_tick
);

let queue: *mut RawQueue = queue.cast();
critical_section::with(|_| unsafe { (*queue).enqueue(item) })
unsafe { (*queue).enqueue(item) }
}

pub(crate) fn receive_queued(queue: *mut c_void, item: *mut c_void, block_time_tick: u32) -> i32 {
Expand All @@ -299,7 +306,7 @@ pub(crate) fn receive_queued(queue: *mut c_void, item: *mut c_void, block_time_t
let queue: *mut RawQueue = queue.cast();

loop {
if critical_section::with(|_| unsafe { (*queue).try_dequeue(item) }) {
if unsafe { (*queue).try_dequeue(item) } {
trace!("received");
return 1;
}
Expand All @@ -317,7 +324,7 @@ pub(crate) fn number_of_messages_in_queue(queue: *const c_void) -> u32 {
trace!("queue_msg_waiting {:?}", queue);

let queue: *const RawQueue = queue.cast();
critical_section::with(|_| unsafe { (*queue).count() as u32 })
unsafe { (*queue).count() as u32 }
}

/// Implementation of sleep() from newlib in esp-idf.
Expand Down

0 comments on commit 3c39057

Please sign in to comment.