[PATCH v1] cpukit/libmisc/capture: fix capture bug
tianye at sugon.com
tianye at sugon.com
Mon May 23 07:40:06 UTC 2022
From: Tian Ye <tianye at 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
More information about the devel
mailing list