[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