[FL-1486] Fix leaks and leak-sanitizer (#538)
* [FL-1486] Fix leaks and leak-sanitizer * Move free_heap to AppLoaderState * App-loader: better heap logging. Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									8cc0a9a998
								
							
						
					
					
						commit
						158c859bdc
					
				| @ -1,4 +1,5 @@ | ||||
| #include "app-loader.h" | ||||
| #include "api-hal-delay.h" | ||||
| 
 | ||||
| #define APP_LOADER_TAG "app_loader" | ||||
| 
 | ||||
| @ -7,6 +8,7 @@ typedef struct { | ||||
|     const FlipperApplication* current_app; | ||||
|     string_t args; | ||||
|     Cli* cli; | ||||
|     size_t free_heap_size; | ||||
| } AppLoaderState; | ||||
| 
 | ||||
| static AppLoaderState state; | ||||
| @ -90,11 +92,29 @@ bool app_loader_start(const char* name, const char* args) { | ||||
| 
 | ||||
| void app_loader_thread_state_callback(FuriThreadState thread_state, void* context) { | ||||
|     furi_assert(context); | ||||
|     if(thread_state == FuriThreadStateStopped) { | ||||
| 
 | ||||
|     AppLoaderState* state = context; | ||||
| 
 | ||||
|     if(thread_state == FuriThreadStateRunning) { | ||||
|         state->free_heap_size = xPortGetFreeHeapSize(); | ||||
|     } else if(thread_state == FuriThreadStateStopped) { | ||||
|         /*
 | ||||
|          * Current Leak Sanitizer assumes that memory is allocated and freed | ||||
|          * inside one thread. Timers are allocated in one task, but freed in | ||||
|          * Timer-Task thread, and xTimerDelete() just put command to queue. | ||||
|          * To avoid some bad cases there are few fixes: | ||||
|          * 1) delay for Timer to process commands | ||||
|          * 2) there are 'heap diff' which shows difference in heap before task | ||||
|          * started and after task completed. In process of leakage monitoring | ||||
|          * both values should be taken into account. | ||||
|          */ | ||||
|         delay(20); | ||||
|         int heap_diff = state->free_heap_size - xPortGetFreeHeapSize(); | ||||
|         FURI_LOG_I( | ||||
|             APP_LOADER_TAG, | ||||
|             "Application thread stopped, heap leaked: %d", | ||||
|             furi_thread_get_heap_size(state.thread)); | ||||
|             "Application thread stopped. Heap allocation balance: %d. Thread allocation balance: %d.", | ||||
|             heap_diff, | ||||
|             furi_thread_get_heap_size(state->thread)); | ||||
|         api_hal_power_insomnia_exit(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -142,6 +142,7 @@ void memmgr_heap_enable_thread_trace(osThreadId_t thread_id) { | ||||
|         MemmgrHeapAllocDict_t alloc_dict; | ||||
|         MemmgrHeapAllocDict_init(alloc_dict); | ||||
|         MemmgrHeapThreadDict_set_at(memmgr_heap_thread_dict, (uint32_t)thread_id, alloc_dict); | ||||
|         MemmgrHeapAllocDict_clear(alloc_dict); | ||||
|         memmgr_heap_thread_trace_depth--; | ||||
|     } | ||||
|     (void)xTaskResumeAll(); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Albert Kharisov
						Albert Kharisov