[PATCH 2/4] capture: Fix capture engine to handle new extensions.
Jennifer Averett
jennifer.averett at oarcorp.com
Thu Jul 10 13:44:13 UTC 2014
---
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
+};
+
/*
* 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? */
+
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;
/**
--
1.8.1.4
More information about the devel
mailing list