kopia lustrzana https://github.com/micropython/micropython
unix: Make the MICROPY_xxx_ATOMIC_SECTION mutex recursive.
This mutex is used to make the unix port behave more like bare metal, i.e. it allows "IRQ handlers" to run exclusively by making the mutex recursive.pull/6246/head
rodzic
342800c9a2
commit
5d0be97bd9
|
@ -156,7 +156,10 @@ STATIC void *btstack_thread(void *arg) {
|
||||||
// Or, if a timeout results in it being set to TIMEOUT.
|
// Or, if a timeout results in it being set to TIMEOUT.
|
||||||
|
|
||||||
while (mp_bluetooth_btstack_state == MP_BLUETOOTH_BTSTACK_STATE_STARTING || mp_bluetooth_btstack_state == MP_BLUETOOTH_BTSTACK_STATE_ACTIVE) {
|
while (mp_bluetooth_btstack_state == MP_BLUETOOTH_BTSTACK_STATE_STARTING || mp_bluetooth_btstack_state == MP_BLUETOOTH_BTSTACK_STATE_ACTIVE) {
|
||||||
|
// Pretend like we're running in IRQ context (i.e. other things can't be running at the same time).
|
||||||
|
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||||
btstack_run_loop_embedded_execute_once();
|
btstack_run_loop_embedded_execute_once();
|
||||||
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
|
|
||||||
// The USB transport schedules events to the run loop at 1ms intervals,
|
// The USB transport schedules events to the run loop at 1ms intervals,
|
||||||
// and the implementation currently polls rather than selects.
|
// and the implementation currently polls rather than selects.
|
||||||
|
|
|
@ -65,7 +65,7 @@ STATIC pthread_key_t tls_key;
|
||||||
// The mutex is used for any code in this port that needs to be thread safe.
|
// The mutex is used for any code in this port that needs to be thread safe.
|
||||||
// Specifically for thread management, access to the linked list is one example.
|
// Specifically for thread management, access to the linked list is one example.
|
||||||
// But also, e.g. scheduler state.
|
// But also, e.g. scheduler state.
|
||||||
STATIC pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;
|
STATIC pthread_mutex_t thread_mutex;
|
||||||
STATIC thread_t *thread;
|
STATIC thread_t *thread;
|
||||||
|
|
||||||
// this is used to synchronise the signal handler of the thread
|
// this is used to synchronise the signal handler of the thread
|
||||||
|
@ -111,6 +111,13 @@ void mp_thread_init(void) {
|
||||||
pthread_key_create(&tls_key, NULL);
|
pthread_key_create(&tls_key, NULL);
|
||||||
pthread_setspecific(tls_key, &mp_state_ctx.thread);
|
pthread_setspecific(tls_key, &mp_state_ctx.thread);
|
||||||
|
|
||||||
|
// Needs to be a recursive mutex to emulate the behavior of
|
||||||
|
// BEGIN_ATOMIC_SECTION on bare metal.
|
||||||
|
pthread_mutexattr_t thread_mutex_attr;
|
||||||
|
pthread_mutexattr_init(&thread_mutex_attr);
|
||||||
|
pthread_mutexattr_settype(&thread_mutex_attr, PTHREAD_MUTEX_RECURSIVE);
|
||||||
|
pthread_mutex_init(&thread_mutex, &thread_mutex_attr);
|
||||||
|
|
||||||
// create first entry in linked list of all threads
|
// create first entry in linked list of all threads
|
||||||
thread = malloc(sizeof(thread_t));
|
thread = malloc(sizeof(thread_t));
|
||||||
thread->id = pthread_self();
|
thread->id = pthread_self();
|
||||||
|
|
Ładowanie…
Reference in New Issue