extmod/modbluetooth: Don't hold atomic section during mp_sched_schedule.
Because, for example, on unix the atomic section isn't re-entrant, and mp_sched_schedule() will try to re-acquire the atomic section.
This commit is contained in:
committed by
Damien George
parent
0da47ecc93
commit
8119ec0765
@@ -160,29 +160,30 @@ STATIC void btstack_packet_handler(uint8_t packet_type, uint16_t channel, uint8_
|
||||
uint16_t value_handle = gatt_event_characteristic_value_query_result_get_value_handle(packet);
|
||||
uint16_t len = gatt_event_characteristic_value_query_result_get_value_length(packet);
|
||||
const uint8_t *data = gatt_event_characteristic_value_query_result_get_value(packet);
|
||||
MICROPY_PY_BLUETOOTH_ENTER
|
||||
len = mp_bluetooth_gattc_on_data_available_start(MP_BLUETOOTH_IRQ_GATTC_READ_RESULT, conn_handle, value_handle, len);
|
||||
mp_uint_t atomic_state;
|
||||
len = mp_bluetooth_gattc_on_data_available_start(MP_BLUETOOTH_IRQ_GATTC_READ_RESULT, conn_handle, value_handle, len, &atomic_state);
|
||||
mp_bluetooth_gattc_on_data_available_chunk(data, len);
|
||||
mp_bluetooth_gattc_on_data_available_end();
|
||||
MICROPY_PY_BLUETOOTH_EXIT
|
||||
mp_bluetooth_gattc_on_data_available_end(atomic_state);
|
||||
} else if (event_type == GATT_EVENT_NOTIFICATION) {
|
||||
DEBUG_EVENT_printf(" --> gatt notification\n");
|
||||
uint16_t conn_handle = gatt_event_notification_get_handle(packet);
|
||||
uint16_t value_handle = gatt_event_notification_get_value_handle(packet);
|
||||
uint16_t len = gatt_event_notification_get_value_length(packet);
|
||||
const uint8_t *data = gatt_event_notification_get_value(packet);
|
||||
len = mp_bluetooth_gattc_on_data_available_start(MP_BLUETOOTH_IRQ_GATTC_NOTIFY, conn_handle, value_handle, len);
|
||||
mp_uint_t atomic_state;
|
||||
len = mp_bluetooth_gattc_on_data_available_start(MP_BLUETOOTH_IRQ_GATTC_NOTIFY, conn_handle, value_handle, len, &atomic_state);
|
||||
mp_bluetooth_gattc_on_data_available_chunk(data, len);
|
||||
mp_bluetooth_gattc_on_data_available_end();
|
||||
mp_bluetooth_gattc_on_data_available_end(atomic_state);
|
||||
} else if (event_type == GATT_EVENT_INDICATION) {
|
||||
DEBUG_EVENT_printf(" --> gatt indication\n");
|
||||
uint16_t conn_handle = gatt_event_indication_get_handle(packet);
|
||||
uint16_t value_handle = gatt_event_indication_get_value_handle(packet);
|
||||
uint16_t len = gatt_event_indication_get_value_length(packet);
|
||||
const uint8_t *data = gatt_event_indication_get_value(packet);
|
||||
len = mp_bluetooth_gattc_on_data_available_start(MP_BLUETOOTH_IRQ_GATTC_INDICATE, conn_handle, value_handle, len);
|
||||
mp_uint_t atomic_state;
|
||||
len = mp_bluetooth_gattc_on_data_available_start(MP_BLUETOOTH_IRQ_GATTC_INDICATE, conn_handle, value_handle, len, &atomic_state);
|
||||
mp_bluetooth_gattc_on_data_available_chunk(data, len);
|
||||
mp_bluetooth_gattc_on_data_available_end();
|
||||
mp_bluetooth_gattc_on_data_available_end(atomic_state);
|
||||
#endif
|
||||
} else {
|
||||
DEBUG_EVENT_printf(" --> hci event type: unknown (0x%02x)\n", event_type);
|
||||
|
||||
Reference in New Issue
Block a user