summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/capture/capture.h
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2007-08-17 00:54:16 +0000
committerChris Johns <chrisj@rtems.org>2007-08-17 00:54:16 +0000
commit1374fd3f072fbb87f0a7af5726fb8a2571a8688e (patch)
tree98a75d741a0c81388858f8ef645265b751270f59 /cpukit/libmisc/capture/capture.h
parent2007-08-13 Chris Johns <chrisj@rtems.org> (diff)
downloadrtems-1374fd3f072fbb87f0a7af5726fb8a2571a8688e.tar.bz2
2007-08-17 Chris Johns <chrisj@rtems.org>
* libmisc/capture/README: Minor copyright change. * libmisc/capture/capture-cli.c, libmisc/capture/capture.c, libmisc/capture/capture.h: Fixed the memory leak when lots of tasks are being created and deleted. Improved the trigger interface so all task type actions can be caught.
Diffstat (limited to 'cpukit/libmisc/capture/capture.h')
-rw-r--r--cpukit/libmisc/capture/capture.h344
1 files changed, 251 insertions, 93 deletions
diff --git a/cpukit/libmisc/capture/capture.h b/cpukit/libmisc/capture/capture.h
index 6db1ee89f3..11b9835e93 100644
--- a/cpukit/libmisc/capture/capture.h
+++ b/cpukit/libmisc/capture/capture.h
@@ -22,7 +22,6 @@
------------------------------------------------------------------------
RTEMS Performance Monitoring and Measurement Framework.
-
This is the Capture Engine component.
*/
@@ -42,44 +41,100 @@ extern "C" {
#define RTEMS_CAPTURE_TRIGGER_TASKS (32)
/**
+ * rtems_capture_from_t
+ *
+ * DESCRIPTION:
+ *
+ * A from capture is a task id and a mask for the type of
+ * from trigger we are interested in. The mask uses the same
+ * bit maps as the flags field in the control structure. There
+ * will only be a from type trigger if the flags in the control
+ * structure has the specific *_BY bit set.
+ */
+typedef struct rtems_capture_from_s
+{
+ rtems_name name;
+ rtems_id id;
+ uint32_t trigger;
+} rtems_capture_from_t;
+
+/**
* rtems_capture_control_t
*
* DESCRIPTION:
*
* RTEMS control holds the trigger and watch configuration for a group of
- * tasks with the same name.
+ * tasks with the same name. The flags hold global control flags.
+ *
+ * The to_triggers fields holds triggers TO this task. The from_triggers holds
+ * triggers from this task. The by_triggers is an OR or triggers which are
+ * caused BY the task listed TO this task. The by_valid flag which entries
+ * in by are valid.
*/
typedef struct rtems_capture_control_s
{
rtems_name name;
rtems_id id;
- uint32_t flags;
- rtems_name from[RTEMS_CAPTURE_TRIGGER_TASKS];
- rtems_id from_id[RTEMS_CAPTURE_TRIGGER_TASKS];
+ uint32_t flags;
+ uint32_t to_triggers;
+ uint32_t from_triggers;
+ uint32_t by_triggers;
+ uint32_t by_valid;
+ rtems_capture_from_t by[RTEMS_CAPTURE_TRIGGER_TASKS];
struct rtems_capture_control_s* next;
} rtems_capture_control_t;
/**
+ * The from_valid mask.
+ */
+#define RTEMS_CAPTURE_CONTROL_FROM_MASK(_s) \
+ (1 << (RTEMS_CAPTURE_TRIGGER_TASKS - ((_s) + 1)))
+
+/**
* Control flags.
*/
#define RTEMS_CAPTURE_WATCH (1 << 0)
-#define RTEMS_CAPTURE_FROM_ANY (1 << 1)
-#define RTEMS_CAPTURE_TO_ANY (1 << 2)
-#define RTEMS_CAPTURE_FROM_TO (1 << 3)
/**
+ * Control triggers.
+ */
+#define RTEMS_CAPTURE_SWITCH (1 << 0)
+#define RTEMS_CAPTURE_CREATE (1 << 1)
+#define RTEMS_CAPTURE_START (1 << 2)
+#define RTEMS_CAPTURE_RESTART (1 << 3)
+#define RTEMS_CAPTURE_DELETE (1 << 4)
+#define RTEMS_CAPTURE_BEGIN (1 << 5)
+#define RTEMS_CAPTURE_EXITTED (1 << 6)
+
+#define RTEMS_CAPTURE_FROM_TRIGS (RTEMS_CAPTURE_SWITCH | \
+ RTEMS_CAPTURE_CREATE | \
+ RTEMS_CAPTURE_START | \
+ RTEMS_CAPTURE_RESTART | \
+ RTEMS_CAPTURE_DELETE)
+
+#define RTEMS_CAPTURE_TO_TRIGS (RTEMS_CAPTURE_SWITCH | \
+ RTEMS_CAPTURE_CREATE | \
+ RTEMS_CAPTURE_START | \
+ RTEMS_CAPTURE_RESTART | \
+ RTEMS_CAPTURE_DELETE | \
+ RTEMS_CAPTURE_BEGIN | \
+ RTEMS_CAPTURE_EXITTED)
+
+/**
* rtems_capture_control_t
*
* DESCRIPTION:
*
* RTEMS capture control provdes the information about a task, along
* with its trigger state. The control is referenced by each
- * capture record. This is* information neeed by the decoder. The
+ * capture record. This is information neeed by the decoder. The
* capture record cannot assume the task will exist when the record is
* dumped via the target interface so task info needed for tracing is
- * copied and held here.
+ * copied and held here. Once the references in the trace buffer
+ * have been removed and the task is deleted this structure is
+ * released back to the heap.
*
- * The inline heper functions provide more details about the info
+ * The inline helper functions provide more details about the info
* contained in this structure.
*
* Note, the tracer code exploits the fact an rtems_name is a
@@ -89,19 +144,20 @@ typedef struct rtems_capture_task_s
{
rtems_name name;
rtems_id id;
- uint32_t flags;
+ uint32_t flags;
+ uint32_t refcount;
rtems_tcb* tcb;
- uint32_t in;
- uint32_t out;
+ uint32_t in;
+ uint32_t out;
rtems_task_priority start_priority;
- uint32_t stack_size;
- uint32_t stack_clean;
- uint32_t ticks;
- uint32_t tick_offset;
- uint32_t ticks_in;
- uint32_t tick_offset_in;
- uint32_t last_ticks;
- uint32_t last_tick_offset;
+ uint32_t stack_size;
+ uint32_t stack_clean;
+ uint32_t ticks;
+ uint32_t tick_offset;
+ uint32_t ticks_in;
+ uint32_t tick_offset_in;
+ uint32_t last_ticks;
+ uint32_t last_tick_offset;
rtems_capture_control_t* control;
struct rtems_capture_task_s* forw;
struct rtems_capture_task_s* back;
@@ -124,46 +180,64 @@ typedef struct rtems_capture_task_s
typedef struct rtems_capture_record_s
{
rtems_capture_task_t* task;
- uint32_t events;
- uint32_t ticks;
- uint32_t tick_offset;
+ uint32_t events;
+ uint32_t ticks;
+ uint32_t tick_offset;
} rtems_capture_record_t;
/**
* The capture record event flags.
*/
-#define RTEMS_CAPTURE_REAL_PRI_EVENT_MASK UINT32_C(0x000000ff)
-#define RTEMS_CAPTURE_CURR_PRI_EVENT_MASK UINT32_C(0x0000ff00)
+#define RTEMS_CAPTURE_REAL_PRI_EVENT_MASK UINT32_C (0x000000ff)
+#define RTEMS_CAPTURE_CURR_PRI_EVENT_MASK UINT32_C (0x0000ff00)
#define RTEMS_CAPTURE_REAL_PRIORITY_EVENT (0)
#define RTEMS_CAPTURE_CURR_PRIORITY_EVENT (8)
#define RTEMS_CAPTURE_EVENT_START (16)
-#define RTEMS_CAPTURE_CREATED_BY_EVENT UINT32_C(0x00010000)
-#define RTEMS_CAPTURE_CREATED_EVENT UINT32_C(0x00020000)
-#define RTEMS_CAPTURE_STARTED_BY_EVENT UINT32_C(0x00040000)
-#define RTEMS_CAPTURE_STARTED_EVENT UINT32_C(0x00080000)
-#define RTEMS_CAPTURE_RESTARTED_BY_EVENT UINT32_C(0x00100000)
-#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_CREATED_BY_EVENT UINT32_C (0x00010000)
+#define RTEMS_CAPTURE_CREATED_EVENT UINT32_C (0x00020000)
+#define RTEMS_CAPTURE_STARTED_BY_EVENT UINT32_C (0x00040000)
+#define RTEMS_CAPTURE_STARTED_EVENT UINT32_C (0x00080000)
+#define RTEMS_CAPTURE_RESTARTED_BY_EVENT UINT32_C (0x00100000)
+#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)
/**
- * rtems_capture_trigger_t
+ * rtems_capture_trigger_mode_t
*
* DESCRIPTION:
*
- * The types of triggers that exist. FIXME: add more here.
+ * The types of trigger modes that exist.
*/
-typedef enum rtems_capture_trigger_t
+typedef enum rtems_capture_trigger_mode_e
{
rtems_capture_to_any,
rtems_capture_from_any,
rtems_capture_from_to
+} rtems_capture_trigger_mode_t;
+
+/**
+ * rtems_capture_trigger_t
+ *
+ * DESCRIPTION:
+ *
+ * The types of triggers that exist.
+ */
+typedef enum rtems_capture_trigger_e
+{
+ rtems_capture_switch,
+ rtems_capture_create,
+ rtems_capture_start,
+ rtems_capture_restart,
+ rtems_capture_delete,
+ rtems_capture_begin,
+ rtems_capture_exitted
} rtems_capture_trigger_t;
/**
@@ -177,32 +251,23 @@ typedef enum rtems_capture_trigger_t
*/
typedef void (*rtems_capture_timestamp)
- (uint32_t * ticks, uint32_t * micro);
+ (uint32_t* ticks, uint32_t* micro);
/**
* rtems_capture_open
*
* DESCRIPTION:
*
- * This function initialises the realtime trace manager allocating the capture
- * buffer. It is assumed we have a working heap at stage of initialisation.
+ * This function initialises the realtime trace manager allocating the
+ * capture buffer. It is assumed we have a working heap at stage of
+ * initialisation.
*
*/
rtems_status_code
-rtems_capture_open (uint32_t size,
+rtems_capture_open (uint32_t size,
rtems_capture_timestamp timestamp);
/**
- * rtems_capture_free_info_on_task_delete
- *
- * DESCRIPTION:
- *
- * If non-zero task informaion if freed when a task is deleted.
- *
- */
-extern int rtems_capture_free_info_on_task_delete;
-
-/**
* rtems_capture_close
*
* DESCRIPTION:
@@ -223,6 +288,18 @@ rtems_capture_close ();
rtems_status_code
rtems_capture_control (rtems_boolean enable);
+/**
+ * rtems_capture_monitor
+ *
+ * DESCRIPTION:
+ *
+ * This function enable the monitor mode. When in the monitor mode
+ * the tasks are monitored but no data is saved. This can be used
+ * to profile the load on a system.
+ */
+rtems_status_code
+rtems_capture_monitor (rtems_boolean enable);
+
/*
* rtems_capture_flush
*
@@ -268,16 +345,18 @@ rtems_capture_watch_del (rtems_name name, rtems_id id);
* disabled.
*/
rtems_status_code
-rtems_capture_watch_ctrl (rtems_name name, rtems_id id, rtems_boolean enable);
+rtems_capture_watch_ctrl (rtems_name name,
+ rtems_id id,
+ rtems_boolean enable);
/**
* rtems_capture_watch_global
*
* DESCRIPTION:
*
- * This function allows control of a global watch. The watch can be enabled or
- * disabled. A global watch configures all tasks below the ceiling and above
- * the floor to be traced.
+ * This function allows control of a global watch. The watch can
+ * be enabled or disabled. A global watch configures all tasks below
+ * the ceiling and above the floor to be traced.
*/
rtems_status_code
rtems_capture_watch_global (rtems_boolean enable);
@@ -343,14 +422,7 @@ rtems_capture_watch_get_floor ();
*
* DESCRIPTION:
*
- * This function sets an edge trigger. Left is the left side of
- * the edge and right is right side of the edge. The trigger type
- * can be -
- *
- * FROM_ANY : a switch from any task to the right side of the edge.
- * TO_ANY : a switch from the left side of the edge to any task.
- * FROM_TO : a switch from the left side of the edge to the right
- * side of the edge.
+ * This function sets a trigger.
*
* This set trigger routine will create a trace control for the
* target task. The task list is searched and any existing tasks
@@ -361,11 +433,29 @@ rtems_capture_watch_get_floor ();
* linked to single control.
*/
rtems_status_code
-rtems_capture_set_trigger (rtems_name from,
- rtems_id from_id,
- rtems_name to,
- rtems_id to_id,
- rtems_capture_trigger_t trigger);
+rtems_capture_set_trigger (rtems_name from_name,
+ rtems_id from_id,
+ rtems_name to_name,
+ rtems_id to_id,
+ rtems_capture_trigger_mode_t mode,
+ rtems_capture_trigger_t trigger);
+
+/**
+ * rtems_capture_clear_trigger
+ *
+ * DESCRIPTION:
+ *
+ * This function clears a trigger.
+ *
+ * This clear trigger routine will not clear a watch.
+ */
+rtems_status_code
+rtems_capture_clear_trigger (rtems_name from_name,
+ rtems_id from_id,
+ rtems_name to_name,
+ rtems_id to_id,
+ rtems_capture_trigger_mode_t mode,
+ rtems_capture_trigger_t trigger);
/**
* rtems_capture_read
@@ -394,14 +484,14 @@ rtems_capture_set_trigger (rtems_name from,
* thrashing occuring for a small number of records, yet allows
* a user configured latiency to be applied for single events.
*
- * The 'timeout' parameter is in micro-seconds. A value of 0 will disable
- * the timeout.
+ * The 'timeout' parameter is in micro-seconds. A value of 0 will
+ * disable the timeout.
*
*/
rtems_status_code
-rtems_capture_read (uint32_t threshold,
- uint32_t timeout,
- uint32_t * read,
+rtems_capture_read (uint32_t threshold,
+ uint32_t timeout,
+ uint32_t* read,
rtems_capture_record_t** recs);
/**
@@ -413,7 +503,7 @@ rtems_capture_read (uint32_t threshold,
* to the capture engine. The count must match the number read.
*/
rtems_status_code
-rtems_capture_release (uint32_t count);
+rtems_capture_release (uint32_t count);
/**
* rtems_capture_tick_time
@@ -825,33 +915,101 @@ rtems_capture_control_flags (rtems_capture_control_t* control)
}
/**
- * rtems_capture_control_from_name
+ * rtems_capture_control_to_triggers
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the task control to triggers.
+ */
+static inline uint32_t
+rtems_capture_control_to_triggers (rtems_capture_control_t* control)
+{
+ return control->to_triggers;
+}
+
+/**
+ * rtems_capture_control_from_triggers
*
* DESCRIPTION:
*
- * This function returns the control from task name.
+ * This function returns the task control from triggers.
+ */
+static inline uint32_t
+rtems_capture_control_from_triggers (rtems_capture_control_t* control)
+{
+ return control->from_triggers;
+}
+
+/**
+ * rtems_capture_control_all_by_triggers
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the task control by triggers.
+ */
+static inline uint32_t
+rtems_capture_control_all_by_triggers (rtems_capture_control_t* control)
+{
+ return control->by_triggers;
+}
+
+/**
+ * rtems_capture_control_by_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the control valid BY flags.
+ */
+static inline int
+rtems_capture_control_by_valid (rtems_capture_control_t* control, int slot)
+{
+ return control->by_valid & RTEMS_CAPTURE_CONTROL_FROM_MASK (slot);
+}
+
+/**
+ * rtems_capture_control_by_name
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the control BY task name.
*/
static inline rtems_name
-rtems_capture_control_from_name (rtems_capture_control_t* control, int from)
+rtems_capture_control_by_name (rtems_capture_control_t* control, int by)
{
- if (from < RTEMS_CAPTURE_TRIGGER_TASKS)
- return control->from[from];
- return control->from[0];
+ if (by < RTEMS_CAPTURE_TRIGGER_TASKS)
+ return control->by[by].name;
+ return control->by[0].name;
}
/**
- * rtems_capture_control_from_id
+ * rtems_capture_control_by_id
*
* DESCRIPTION:
*
- * This function returns the control from task id.
+ * This function returns the control BY task id.
*/
static inline rtems_id
-rtems_capture_control_from_id (rtems_capture_control_t* control, int from)
+rtems_capture_control_by_id (rtems_capture_control_t* control, int by)
+{
+ if (by < RTEMS_CAPTURE_TRIGGER_TASKS)
+ return control->by[by].id;
+ return control->by[0].id;
+}
+
+/**
+ * rtems_capture_control_by_triggers
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the control BY task triggers.
+ */
+static inline uint32_t
+rtems_capture_control_by_triggers (rtems_capture_control_t* control,
+ int by)
{
- if (from < RTEMS_CAPTURE_TRIGGER_TASKS)
- return control->from_id[from];
- return control->from_id[0];
+ if (by < RTEMS_CAPTURE_TRIGGER_TASKS)
+ return control->by[by].trigger;
+ return control->by[0].trigger;
}
/**
@@ -866,7 +1024,7 @@ static inline uint32_t
rtems_capture_control_count ()
{
rtems_capture_control_t* control = rtems_capture_get_control_list ();
- uint32_t count = 0;
+ uint32_t count = 0;
while (control)
{