On 10/07/2014 11:44 pm, Jennifer Averett wrote:
---
  cpukit/libmisc/capture/capture.c | 96 ++++++++++++++++++++++++++++------------
  cpukit/libmisc/capture/capture.h | 17 ++++---
  2 files changed, 78 insertions(+), 35 deletions(-)

diff --git a/cpukit/libmisc/capture/capture.c b/cpukit/libmisc/capture/capture.c
index 6f8e0a2..ec5e408 100644
--- a/cpukit/libmisc/capture/capture.c
+++ b/cpukit/libmisc/capture/capture.c
@@ -51,11 +51,41 @@
                                        RTEMS_CAPTURE_DELETED_BY_EVENT | \
                                        RTEMS_CAPTURE_DELETED_EVENT | \
                                        RTEMS_CAPTURE_BEGIN_EVENT | \
-                                      RTEMS_CAPTURE_EXITTED_EVENT)
+                                      RTEMS_CAPTURE_EXITTED_EVENT | \
+                                      RTEMS_CAPTURE_TERMINATED_EVENT)
  #else
  #define RTEMS_CAPTURE_RECORD_EVENTS  (0)
  #endif

+static bool
+rtems_capture_create_task (rtems_tcb* current_task,
+                           rtems_tcb* new_task);
+
+static void
+rtems_capture_start_task (rtems_tcb* current_task,
+                          rtems_tcb* started_task);
+
+static void
+rtems_capture_restart_task (rtems_tcb* current_task,
+                            rtems_tcb* restarted_task);
+
+static void
+rtems_capture_delete_task (rtems_tcb* current_task,
+                           rtems_tcb* deleted_task);
+
+static void
+rtems_capture_switch_task (rtems_tcb* current_task,
+                           rtems_tcb* heir_task);
+
+static void
+rtems_capture_begin_task (rtems_tcb* begin_task);
+
+static void
+rtems_capture_exitted_task (rtems_tcb* exitted_task);
+
+static void
+rtems_capture_terminated_task (rtems_tcb* terminated_task);
+
  /*
   * Global capture flags.
   */
@@ -88,6 +118,18 @@ static rtems_id                 capture_reader;
  static rtems_interrupt_lock     capture_lock =
    RTEMS_INTERRUPT_LOCK_INITIALIZER("capture");

+static rtems_extensions_table capture_extensions = {
+  .thread_create    = rtems_capture_create_task,
+  .thread_start     = rtems_capture_start_task,
+  .thread_restart   = rtems_capture_restart_task,
+  .thread_delete    = rtems_capture_delete_task,
+  .thread_switch    = rtems_capture_switch_task,
+  .thread_begin     = rtems_capture_begin_task,
+  .thread_exitted   = rtems_capture_exitted_task,
+  .fatal            = NULL,
+  .thread_terminate = rtems_capture_terminated_task
+};
+

This should be const so it lives in the program text. A requirement has always been to not use any RAM if not enabled and linked in and the requirement is mostly met with just a few pointers plus the lock.

  /*
   * RTEMS Event text.
   */
@@ -101,6 +143,7 @@ static const char* capture_event_text[] =
    "RESTARTED",
    "DELETED_BY",
    "DELETED",
+  "TERMINATED",
    "BEGIN",
    "EXITTED",
    "SWITCHED_OUT",
@@ -787,21 +830,28 @@ rtems_capture_exitted_task (rtems_tcb* exitted_task)
  static void
  rtems_capture_terminated_task (rtems_tcb* terminated_task)
  {
-  rtems_capture_delete_task (terminated_task, terminated_task);
-}
+  /*
+   * Get the capture task control block so we can trace this
+   * event.
+   */
+  rtems_capture_task_t* tt;

-/*
- * This function is called when a fatal error occurs.
- */
-static void
-rtems_capture_fatal(
-  Internal_errors_Source source,
-  bool                   is_internal,
-  Internal_errors_t      code
-)
-{
+  tt = terminated_task->extensions[capture_extension_index];
+
+  /*
+   * The task pointers may not be known as the task may have
+   * been created before the capture engine was open. Add them.
+   */
+
+  if (tt == NULL)
+    tt = rtems_capture_create_capture_task (terminated_task);
+
+  if (rtems_capture_trigger (NULL, tt, RTEMS_CAPTURE_TERMINATED))
+    rtems_capture_record (tt, RTEMS_CAPTURE_TERMINATED_EVENT);
+
+  rtems_capture_task_stack_usage (tt);
  }
-
+
  /*
   * This function is called when a context is switched.
   */
@@ -887,7 +937,6 @@ rtems_capture_switch_task (rtems_tcb* current_task,
  rtems_status_code
  rtems_capture_open (uint32_t   size, rtems_capture_timestamp timestamp 
__attribute__((unused)))
  {
-  rtems_extensions_table capture_extensions;
    rtems_name             name;
    rtems_status_code      sc;

@@ -913,19 +962,6 @@ rtems_capture_open (uint32_t   size, 
rtems_capture_timestamp timestamp __attribu
    capture_floor   = 255;

    /*
-   * Create the extension table. This is copied so we
-   * can create it as a local.
-   */
-  capture_extensions.thread_create  = rtems_capture_create_task;
-  capture_extensions.thread_start   = rtems_capture_start_task;
-  capture_extensions.thread_restart = rtems_capture_restart_task;
-  capture_extensions.thread_delete  = rtems_capture_delete_task;
-  capture_extensions.thread_switch  = rtems_capture_switch_task;
-  capture_extensions.thread_begin   = rtems_capture_begin_task;
-  capture_extensions.thread_exitted = rtems_capture_exitted_task;
-  capture_extensions.fatal          = NULL;
-
-  /*
     * Register the user extension handlers for the CAPture Engine.
     */
    name = rtems_build_name ('C', 'A', 'P', 'E');
@@ -1341,6 +1377,8 @@ rtems_capture_map_trigger (rtems_capture_trigger_t 
trigger)
        return RTEMS_CAPTURE_BEGIN;
      case rtems_capture_exitted:
        return RTEMS_CAPTURE_EXITTED;
+    case rtems_capture_terminated:
+      return RTEMS_CAPTURE_TERMINATED;
      default:
        break;
    }
@@ -1542,6 +1580,8 @@ rtems_capture_read (uint32_t                 threshold,
    *read = 0;
    *recs = NULL;

+  /* XXX read or rec == NULL? */
+

What does this mean ?

If we support doxygen should be use something that can be parsed and collected ?

    rtems_interrupt_lock_acquire (&capture_lock, &lock_context);

    /*
diff --git a/cpukit/libmisc/capture/capture.h b/cpukit/libmisc/capture/capture.h
index fa82f6d..737c73f 100644
--- a/cpukit/libmisc/capture/capture.h
+++ b/cpukit/libmisc/capture/capture.h
@@ -120,6 +120,7 @@ typedef struct rtems_capture_control_s
  #define RTEMS_CAPTURE_DELETE        (1 << 4)
  #define RTEMS_CAPTURE_BEGIN         (1 << 5)
  #define RTEMS_CAPTURE_EXITTED       (1 << 6)
+#define RTEMS_CAPTURE_TERMINATED    (1 << 7)

  #define RTEMS_CAPTURE_FROM_TRIGS    (RTEMS_CAPTURE_SWITCH  | \
                                       RTEMS_CAPTURE_CREATE | \
@@ -208,12 +209,13 @@ typedef struct rtems_capture_record_s
  #define RTEMS_CAPTURE_RESTARTED_EVENT     UINT32_C (0x00200000)
  #define RTEMS_CAPTURE_DELETED_BY_EVENT    UINT32_C (0x00400000)
  #define RTEMS_CAPTURE_DELETED_EVENT       UINT32_C (0x00800000)
-#define RTEMS_CAPTURE_BEGIN_EVENT         UINT32_C (0x01000000)
-#define RTEMS_CAPTURE_EXITTED_EVENT       UINT32_C (0x02000000)
-#define RTEMS_CAPTURE_SWITCHED_OUT_EVENT  UINT32_C (0x04000000)
-#define RTEMS_CAPTURE_SWITCHED_IN_EVENT   UINT32_C (0x08000000)
-#define RTEMS_CAPTURE_TIMESTAMP           UINT32_C (0x10000000)
-#define RTEMS_CAPTURE_EVENT_END           (28)
+#define RTEMS_CAPTURE_TERMINATED_EVENT    UINT32_C (0x01000000)
+#define RTEMS_CAPTURE_BEGIN_EVENT         UINT32_C (0x02000000)
+#define RTEMS_CAPTURE_EXITTED_EVENT       UINT32_C (0x04000000)
+#define RTEMS_CAPTURE_SWITCHED_OUT_EVENT  UINT32_C (0x08000000)
+#define RTEMS_CAPTURE_SWITCHED_IN_EVENT   UINT32_C (0x10000000)
+#define RTEMS_CAPTURE_TIMESTAMP           UINT32_C (0x20000000)
+#define RTEMS_CAPTURE_EVENT_END           (29)

  /**
   * @brief Capture trigger modes
@@ -240,7 +242,8 @@ typedef enum rtems_capture_trigger_e
    rtems_capture_restart,
    rtems_capture_delete,
    rtems_capture_begin,
-  rtems_capture_exitted
+  rtems_capture_exitted,
+  rtems_capture_terminated
  } rtems_capture_trigger_t;

  /**

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to