From: Tian Ye <tia...@sugon.com> --- cpukit/libmisc/capture/capture.c | 30 ++++++++++++++++++++---- cpukit/libmisc/capture/capture_support.c | 8 +++++-- 2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/cpukit/libmisc/capture/capture.c b/cpukit/libmisc/capture/capture.c index 2228d135b8..886b4f62ed 100644 --- a/cpukit/libmisc/capture/capture.c +++ b/cpukit/libmisc/capture/capture.c @@ -292,6 +292,23 @@ rtems_capture_find_control (rtems_name name, rtems_id id) return control; } +static bool +rtems_capture_uninitialize_control (rtems_tcb *tcb, void *arg) +{ + rtems_name name = rtems_build_name(0, 0, 0, 0); + rtems_id id; + + id = tcb->Object.id; + if (rtems_capture_task_api (id) != OBJECTS_POSIX_API) + rtems_object_get_classic_name (id, &name); + if (rtems_capture_match_name_id (((rtems_capture_control *)arg)->name, + ((rtems_capture_control *)arg)->id, name, id)) + { + tcb->Capture.control = NULL; + } + return false; +} + /* * This function checks if a new control structure matches * the given task and sets the control if it does. @@ -699,6 +716,7 @@ rtems_capture_close (void) { rtems_capture_control* delete = control; control = control->next; + _Thread_Iterate (rtems_capture_uninitialize_control, (void *)delete); free (delete); } @@ -789,6 +807,7 @@ rtems_capture_flush (bool prime) { rtems_interrupt_lock_context lock_context_global; uint32_t cpu; + uint32_t* cpu_flags; rtems_interrupt_lock_acquire (&capture_lock_global, &lock_context_global); @@ -800,16 +819,17 @@ rtems_capture_flush (bool prime) _Thread_Iterate (rtems_capture_flush_tcb, NULL); - if (prime) - capture_flags_global &= ~(RTEMS_CAPTURE_TRIGGERED | RTEMS_CAPTURE_OVERFLOW); - else - capture_flags_global &= ~RTEMS_CAPTURE_OVERFLOW; + if (prime) { + capture_flags_global &= ~RTEMS_CAPTURE_TRIGGERED; + } for (cpu=0; cpu < rtems_scheduler_get_processor_maximum(); cpu++) { RTEMS_INTERRUPT_LOCK_REFERENCE( lock, &(capture_lock_on_cpu( cpu )) ) rtems_interrupt_lock_context lock_context_per_cpu; rtems_interrupt_lock_acquire (lock, &lock_context_per_cpu); + cpu_flags = &(capture_flags_on_cpu (cpu)); + *cpu_flags &= ~RTEMS_CAPTURE_OVERFLOW; capture_count_on_cpu(cpu) = 0; if (capture_records_on_cpu(cpu).buffer) rtems_capture_buffer_flush( &capture_records_on_cpu(cpu) ); @@ -885,6 +905,8 @@ rtems_capture_watch_del (rtems_name name, rtems_id id) *prev_control = control->next; + _Thread_Iterate (rtems_capture_uninitialize_control, (void *)control); + rtems_interrupt_lock_release (&capture_lock_global, &lock_context); free (control); diff --git a/cpukit/libmisc/capture/capture_support.c b/cpukit/libmisc/capture/capture_support.c index 5b685479d7..fb4ccfe2d8 100644 --- a/cpukit/libmisc/capture/capture_support.c +++ b/cpukit/libmisc/capture/capture_support.c @@ -247,7 +247,7 @@ rtems_capture_print_record_capture(int cpu, { fprintf(stdout,"%2i ", cpu); rtems_capture_print_timestamp (rec->time); - fprintf (stdout, " %12" PRId32 " ", (uint32_t) diff); + fprintf (stdout, " %12" PRIu32 " ", (uint32_t) diff); rtems_monitor_dump_id (rec->task_id); if (name != NULL) { @@ -439,7 +439,11 @@ rtems_capture_print_watch_list (void) fprintf (stdout, " "); rtems_monitor_dump_id (rtems_capture_control_id (control)); fprintf (stdout, " "); - rtems_monitor_dump_name (rtems_capture_control_name (control)); + char name[5] = "????"; + if (rtems_capture_control_name(control) != 0) { + _Objects_Name_to_string((Objects_Name)rtems_capture_control_name (control), false, name, 5); + } + fprintf(stdout, "%s", name); flags = rtems_capture_control_flags (control); fprintf (stdout, " %c%c ", rtems_capture_watch_global_on () ? 'g' : '-', -- 2.25.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel