Skip to content

Commit 4d7f2b9

Browse files
Fix CoreMutex infinite recursion crash
Core could crash while Serial debugging was going on and prints were happening from LWIP/IRQ land and the main app.
1 parent dc93959 commit 4d7f2b9

File tree

4 files changed

+12
-10
lines changed

4 files changed

+12
-10
lines changed

cores/rp2040/CoreMutex.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,18 @@
2727

2828
class CoreMutex {
2929
public:
30-
CoreMutex(mutex_t *mutex) {
30+
CoreMutex(mutex_t *mutex, bool debugEnable = true) {
3131
uint32_t owner;
3232
_mutex = mutex;
3333
_acquired = false;
3434
if (!mutex_try_enter(_mutex, &owner)) {
3535
if (owner == get_core_num()) { // Deadlock!
36-
DEBUGCORE("CoreMutex - Deadlock detected!\n");
36+
if (debugEnable) {
37+
DEBUGCORE("CoreMutex - Deadlock detected!\n");
38+
}
3739
return;
3840
}
39-
mutex_enter_blocking(_mutex);
41+
// mutex_enter_blocking(_mutex);
4042
}
4143
_acquired = true;
4244
}

cores/rp2040/SerialUSB.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void SerialUSB::end() {
6464
}
6565

6666
int SerialUSB::peek() {
67-
CoreMutex m(&__usb_mutex);
67+
CoreMutex m(&__usb_mutex, false);
6868
if (!_running || !m) {
6969
return 0;
7070
}
@@ -74,7 +74,7 @@ int SerialUSB::peek() {
7474
}
7575

7676
int SerialUSB::read() {
77-
CoreMutex m(&__usb_mutex);
77+
CoreMutex m(&__usb_mutex, false);
7878
if (!_running || !m) {
7979
return -1;
8080
}
@@ -86,7 +86,7 @@ int SerialUSB::read() {
8686
}
8787

8888
int SerialUSB::available() {
89-
CoreMutex m(&__usb_mutex);
89+
CoreMutex m(&__usb_mutex, false);
9090
if (!_running || !m) {
9191
return 0;
9292
}
@@ -95,7 +95,7 @@ int SerialUSB::available() {
9595
}
9696

9797
int SerialUSB::availableForWrite() {
98-
CoreMutex m(&__usb_mutex);
98+
CoreMutex m(&__usb_mutex, false);
9999
if (!_running || !m) {
100100
return 0;
101101
}
@@ -104,7 +104,7 @@ int SerialUSB::availableForWrite() {
104104
}
105105

106106
void SerialUSB::flush() {
107-
CoreMutex m(&__usb_mutex);
107+
CoreMutex m(&__usb_mutex, false);
108108
if (!_running || !m) {
109109
return;
110110
}
@@ -117,7 +117,7 @@ size_t SerialUSB::write(uint8_t c) {
117117
}
118118

119119
size_t SerialUSB::write(const uint8_t *buf, size_t length) {
120-
CoreMutex m(&__usb_mutex);
120+
CoreMutex m(&__usb_mutex, false);
121121
if (!_running || !m) {
122122
return 0;
123123
}
@@ -155,7 +155,7 @@ size_t SerialUSB::write(const uint8_t *buf, size_t length) {
155155
}
156156

157157
SerialUSB::operator bool() {
158-
CoreMutex m(&__usb_mutex);
158+
CoreMutex m(&__usb_mutex, false);
159159
if (!_running || !m) {
160160
return false;
161161
}

lib/libpico-ipv6.a

-12.7 KB
Binary file not shown.

lib/libpico.a

-11.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)