Skip to content

Commit 1130007

Browse files
Make mutexes init in DATA, not ((counstructor)) (#645)
There was a race condition in making mutexes that were only init in an __attribute((constructor)) code block. For example, a global object might do a `malloc` in its constructor which would depend on the malloc mutex...which may not yet have been initted. Make them initted in the .data section, instead, which is guaranteed good before any global constructors are called.
1 parent a0060d9 commit 1130007

File tree

1 file changed

+16
-22
lines changed

1 file changed

+16
-22
lines changed

cores/rp2040/lock.cpp renamed to cores/rp2040/lock.c

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,28 +25,22 @@
2525
#include <pico/mutex.h>
2626
#include <sys/lock.h>
2727

28-
recursive_mutex_t __lock___sinit_recursive_mutex;
29-
recursive_mutex_t __lock___sfp_recursive_mutex;
30-
recursive_mutex_t __lock___atexit_recursive_mutex;
31-
mutex_t __lock___at_quick_exit_mutex;
32-
recursive_mutex_t __lock___malloc_recursive_mutex;
33-
recursive_mutex_t __lock___env_recursive_mutex;
34-
mutex_t __lock___tz_mutex;
35-
mutex_t __lock___dd_hash_mutex;
36-
mutex_t __lock___arc4random_mutex;
37-
38-
39-
__attribute__((constructor)) void __init_all_newlib_mutexes() {
40-
recursive_mutex_init(&__lock___sinit_recursive_mutex);
41-
recursive_mutex_init(&__lock___sfp_recursive_mutex);
42-
recursive_mutex_init(&__lock___atexit_recursive_mutex);
43-
mutex_init(&__lock___at_quick_exit_mutex);
44-
recursive_mutex_init(&__lock___malloc_recursive_mutex);
45-
recursive_mutex_init(&__lock___env_recursive_mutex);
46-
mutex_init(&__lock___tz_mutex);
47-
mutex_init(&__lock___dd_hash_mutex);
48-
mutex_init(&__lock___arc4random_mutex);
49-
}
28+
// HACK ALERT
29+
// Pico-SDK defines mutex which can be at global scope, but when the auto_init_
30+
// macros are used they are defined as static. Newlib needs global access to
31+
// these mutextes, so instead of hacking pico-sdk just make "static" a no-op.
32+
33+
#define static
34+
auto_init_recursive_mutex(__lock___sinit_recursive_mutex);
35+
auto_init_recursive_mutex(__lock___sfp_recursive_mutex);
36+
auto_init_recursive_mutex(__lock___atexit_recursive_mutex);
37+
auto_init_mutex(__lock___at_quick_exit_mutex);
38+
auto_init_recursive_mutex(__lock___malloc_recursive_mutex);
39+
auto_init_recursive_mutex(__lock___env_recursive_mutex);
40+
auto_init_mutex(__lock___tz_mutex);
41+
auto_init_mutex(__lock___dd_hash_mutex);
42+
auto_init_mutex(__lock___arc4random_mutex);
43+
#undef static
5044

5145
void __retarget_lock_init(_LOCK_T *lock) {
5246
mutex_init((mutex_t*) lock);

0 commit comments

Comments
 (0)