summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2024-02-14 12:39:27 +1100
committerDamien George <damien@micropython.org>2024-02-15 16:05:41 +1100
commitc27d304bed737ef0315ca695323f7adc42e61ba9 (patch)
tree8f9abba81678ed5581ede498127e9c89d5963d38
parent34097b776e00e81bcf2fdd3a2b13472a6085dee9 (diff)
esp32/mpnimbleport: Release the GIL while doing NimBLE port deinit.
In case callbacks must run (eg a disconnect event happens during the deinit) and the GIL must be obtained to run the callback. Fixes part of issue #12349. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--ports/esp32/mpnimbleport.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/ports/esp32/mpnimbleport.c b/ports/esp32/mpnimbleport.c
index 8235275be..5b57edf3c 100644
--- a/ports/esp32/mpnimbleport.c
+++ b/ports/esp32/mpnimbleport.c
@@ -63,6 +63,11 @@ void mp_bluetooth_nimble_port_start(void) {
void mp_bluetooth_nimble_port_shutdown(void) {
DEBUG_printf("mp_bluetooth_nimble_port_shutdown\n");
+ #if MICROPY_PY_BLUETOOTH_USE_SYNC_EVENTS_WITH_INTERLOCK
+ // Release the GIL so any callbacks can run during the shutdown calls below.
+ MP_THREAD_GIL_EXIT();
+ #endif
+
// Despite the name, these is an ESP32-specific (no other NimBLE ports have these functions).
// Calls ble_hs_stop() and waits for stack shutdown.
nimble_port_stop();
@@ -70,6 +75,10 @@ void mp_bluetooth_nimble_port_shutdown(void) {
// Shuts down the event queue.
nimble_port_deinit();
+ #if MICROPY_PY_BLUETOOTH_USE_SYNC_EVENTS_WITH_INTERLOCK
+ MP_THREAD_GIL_ENTER();
+ #endif
+
// Mark stack as shutdown.
mp_bluetooth_nimble_ble_state = MP_BLUETOOTH_NIMBLE_BLE_STATE_OFF;
}