|
|
@@ -1871,6 +1871,17 @@ int target_free_working_area(struct target *target, struct working_area *area) |
|
|
|
return target_free_working_area_restore(target, area, 1); |
|
|
|
} |
|
|
|
|
|
|
|
static void target_destroy(struct target *target) |
|
|
|
{ |
|
|
|
if (target->type->deinit_target) |
|
|
|
target->type->deinit_target(target); |
|
|
|
|
|
|
|
free(target->type); |
|
|
|
free(target->trace_info); |
|
|
|
free(target->cmd_name); |
|
|
|
free(target); |
|
|
|
} |
|
|
|
|
|
|
|
void target_quit(void) |
|
|
|
{ |
|
|
|
struct target_event_callback *pe = target_event_callbacks; |
|
|
@@ -1889,11 +1900,15 @@ void target_quit(void) |
|
|
|
} |
|
|
|
target_timer_callbacks = NULL; |
|
|
|
|
|
|
|
for (struct target *target = all_targets; |
|
|
|
target; target = target->next) { |
|
|
|
if (target->type->deinit_target) |
|
|
|
target->type->deinit_target(target); |
|
|
|
for (struct target *target = all_targets; target;) { |
|
|
|
struct target *tmp; |
|
|
|
|
|
|
|
tmp = target->next; |
|
|
|
target_destroy(target); |
|
|
|
target = tmp; |
|
|
|
} |
|
|
|
|
|
|
|
all_targets = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
/* free resources and restore memory, if restoring memory fails, |
|
|
|