bt: Fix race condition when disconnect during TX (#1260)
* bt: Fix race condition when disconnect during TX * bt: Move flag clear to not be in middle of other logic * bt: Bail out of send bytes a little bit earlier Co-authored-by: gornekich <n.gorbadey@gmail.com> Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									eb83b0f02a
								
							
						
					
					
						commit
						f90c9320d9
					
				
							
								
								
									
										16
									
								
								applications/bt/bt_service/bt.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										16
									
								
								applications/bt/bt_service/bt.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @ -167,7 +167,11 @@ static void bt_rpc_send_bytes_callback(void* context, uint8_t* bytes, size_t byt | ||||
|     furi_assert(context); | ||||
|     Bt* bt = context; | ||||
| 
 | ||||
|     osEventFlagsClear(bt->rpc_event, BT_RPC_EVENT_ALL); | ||||
|     if(osEventFlagsGet(bt->rpc_event) & BT_RPC_EVENT_DISCONNECTED) { | ||||
|         // Early stop from sending if we're already disconnected
 | ||||
|         return; | ||||
|     } | ||||
|     osEventFlagsClear(bt->rpc_event, BT_RPC_EVENT_ALL & (~BT_RPC_EVENT_DISCONNECTED)); | ||||
|     size_t bytes_sent = 0; | ||||
|     while(bytes_sent < bytes_len) { | ||||
|         size_t bytes_remain = bytes_len - bytes_sent; | ||||
| @ -178,10 +182,14 @@ static void bt_rpc_send_bytes_callback(void* context, uint8_t* bytes, size_t byt | ||||
|             furi_hal_bt_serial_tx(&bytes[bytes_sent], bytes_remain); | ||||
|             bytes_sent += bytes_remain; | ||||
|         } | ||||
|         uint32_t event_flag = | ||||
|             osEventFlagsWait(bt->rpc_event, BT_RPC_EVENT_ALL, osFlagsWaitAny, osWaitForever); | ||||
|         // We want BT_RPC_EVENT_DISCONNECTED to stick, so don't clear
 | ||||
|         uint32_t event_flag = osEventFlagsWait( | ||||
|             bt->rpc_event, BT_RPC_EVENT_ALL, osFlagsWaitAny | osFlagsNoClear, osWaitForever); | ||||
|         if(event_flag & BT_RPC_EVENT_DISCONNECTED) { | ||||
|             break; | ||||
|         } else { | ||||
|             // If we didn't get BT_RPC_EVENT_DISCONNECTED, then clear everything else
 | ||||
|             osEventFlagsClear(bt->rpc_event, BT_RPC_EVENT_ALL & (~BT_RPC_EVENT_DISCONNECTED)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -197,6 +205,8 @@ static bool bt_on_gap_event_callback(GapEvent event, void* context) { | ||||
|         bt->status = BtStatusConnected; | ||||
|         BtMessage message = {.type = BtMessageTypeUpdateStatus}; | ||||
|         furi_check(osMessageQueuePut(bt->message_queue, &message, 0, osWaitForever) == osOK); | ||||
|         // Clear BT_RPC_EVENT_DISCONNECTED because it might be set from previous session
 | ||||
|         osEventFlagsClear(bt->rpc_event, BT_RPC_EVENT_DISCONNECTED); | ||||
|         if(bt->profile == BtProfileSerial) { | ||||
|             // Open RPC session
 | ||||
|             bt->rpc_session = rpc_session_open(bt->rpc); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Yukai Li
						Yukai Li