summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/capture/capture_user_extension.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libmisc/capture/capture_user_extension.c')
-rw-r--r--cpukit/libmisc/capture/capture_user_extension.c219
1 files changed, 44 insertions, 175 deletions
diff --git a/cpukit/libmisc/capture/capture_user_extension.c b/cpukit/libmisc/capture/capture_user_extension.c
index 4236d8caeb..4c7bc1d260 100644
--- a/cpukit/libmisc/capture/capture_user_extension.c
+++ b/cpukit/libmisc/capture/capture_user_extension.c
@@ -84,20 +84,20 @@ static const rtems_extensions_table capture_extensions = {
.thread_terminate = rtems_capture_terminated_task
};
-
static inline void rtems_capture_record (
- rtems_capture_task_t* task,
- uint32_t events
+ rtems_tcb* tcb,
+ uint32_t events
)
{
rtems_capture_record_t* rec;
+ void* ptr;
+ size_t size = sizeof(*rec);
- if (rtems_capture_filter( task, events) )
+ if (rtems_capture_filter( tcb, events) )
return;
-
- rtems_capture_begin_add_record (task, events, sizeof(*rec), &rec);
- rtems_capture_end_add_record ( rec );
+ rtems_capture_begin_add_record (tcb, events, size, &ptr);
+ rtems_capture_end_add_record ( ptr );
}
@@ -133,27 +133,21 @@ rtems_status_code rtems_capture_user_extension_close(void)
* This function is called when a task is created.
*/
static bool
-rtems_capture_create_task (rtems_tcb* current_task,
- rtems_tcb* new_task)
+rtems_capture_create_task (rtems_tcb* ct,
+ rtems_tcb* nt)
{
- rtems_capture_task_t* ct;
- rtems_capture_task_t* nt;
- int index = rtems_capture_get_extension_index();
-
- ct = current_task->extensions[index];
-
/*
* The task pointers may not be known as the task may have
* been created before the capture engine was open. Add them.
*/
- if (ct == NULL)
- ct = rtems_capture_create_capture_task (current_task);
+ if (!rtems_capture_task_recorded (ct))
+ rtems_capture_record_task (ct);
/*
* Create the new task's capture control block.
*/
- nt = rtems_capture_create_capture_task (new_task);
+ rtems_capture_record_task (nt);
if (rtems_capture_trigger (ct, nt, RTEMS_CAPTURE_CREATE))
{
@@ -168,147 +162,85 @@ rtems_capture_create_task (rtems_tcb* current_task,
* This function is called when a task is started.
*/
static void
-rtems_capture_start_task (rtems_tcb* current_task,
- rtems_tcb* started_task)
+rtems_capture_start_task (rtems_tcb* ct,
+ rtems_tcb* st)
{
/*
- * Get the capture task control block so we can trace this
- * event.
- */
- rtems_capture_task_t* ct;
- rtems_capture_task_t* st;
- int index = rtems_capture_get_extension_index();
-
- ct = current_task->extensions[index];
- st = started_task->extensions[index];
-
- /*
* The task pointers may not be known as the task may have
* been created before the capture engine was open. Add them.
*/
- if (ct == NULL)
- ct = rtems_capture_create_capture_task (current_task);
+ if (!rtems_capture_task_recorded (ct))
+ rtems_capture_record_task (ct);
if (st == NULL)
- st = rtems_capture_create_capture_task (started_task);
+ rtems_capture_record_task (st);
if (rtems_capture_trigger (ct, st, RTEMS_CAPTURE_START))
{
rtems_capture_record (ct, RTEMS_CAPTURE_STARTED_BY_EVENT);
rtems_capture_record (st, RTEMS_CAPTURE_STARTED_EVENT);
}
-
- rtems_capture_init_stack_usage (st);
}
/*
* This function is called when a task is restarted.
*/
static void
-rtems_capture_restart_task (rtems_tcb* current_task,
- rtems_tcb* restarted_task)
+rtems_capture_restart_task (rtems_tcb* ct,
+ rtems_tcb* rt)
{
/*
- * Get the capture task control block so we can trace this
- * event.
- */
- rtems_capture_task_t* ct;
- rtems_capture_task_t* rt;
- int index = rtems_capture_get_extension_index();
-
- ct = current_task->extensions[index];
- rt = restarted_task->extensions[index];
-
- /*
* The task pointers may not be known as the task may have
* been created before the capture engine was open. Add them.
*/
- if (ct == NULL)
- ct = rtems_capture_create_capture_task (current_task);
+ if (!rtems_capture_task_recorded (ct))
+ rtems_capture_record_task (ct);
- if (rt == NULL)
- rt = rtems_capture_create_capture_task (restarted_task);
+ if (!rtems_capture_task_recorded (rt))
+ rtems_capture_record_task (rt);
if (rtems_capture_trigger (ct, rt, RTEMS_CAPTURE_RESTART))
{
rtems_capture_record (ct, RTEMS_CAPTURE_RESTARTED_BY_EVENT);
rtems_capture_record (rt, RTEMS_CAPTURE_RESTARTED_EVENT);
}
-
- rtems_capture_task_stack_usage (rt);
- rtems_capture_init_stack_usage (rt);
}
/*
* This function is called when a task is deleted.
*/
static void
-rtems_capture_delete_task (rtems_tcb* current_task,
- rtems_tcb* deleted_task)
+rtems_capture_delete_task (rtems_tcb* ct,
+ rtems_tcb* dt)
{
- /*
- * Get the capture task control block so we can trace this
- * event.
- */
- rtems_capture_task_t* ct;
- rtems_capture_task_t* dt;
- int index = rtems_capture_get_extension_index();
-
- /*
- * The task pointers may not be known as the task may have
- * been created before the capture engine was open. Add them.
- */
-
- ct = current_task->extensions[index];
- dt = deleted_task->extensions[index];
+ if (!rtems_capture_task_recorded (ct))
+ rtems_capture_record_task (ct);
- if (ct == NULL)
- ct = rtems_capture_create_capture_task (current_task);
-
- if (dt == NULL)
- dt = rtems_capture_create_capture_task (deleted_task);
+ if (!rtems_capture_task_recorded (dt))
+ rtems_capture_record_task (dt);
if (rtems_capture_trigger (ct, dt, RTEMS_CAPTURE_DELETE))
{
rtems_capture_record (ct, RTEMS_CAPTURE_DELETED_BY_EVENT);
rtems_capture_record (dt, RTEMS_CAPTURE_DELETED_EVENT);
}
-
- rtems_capture_task_stack_usage (dt);
-
- /*
- * This task's tcb will be invalid. This signals the
- * task has been deleted.
- */
- dt->tcb = 0;
-
- rtems_capture_destroy_capture_task (dt);
}
/*
* This function is called when a task is begun.
*/
static void
-rtems_capture_begin_task (rtems_tcb* begin_task)
+rtems_capture_begin_task (rtems_tcb* bt)
{
/*
- * Get the capture task control block so we can trace this
- * event.
- */
- rtems_capture_task_t* bt;
- int index = rtems_capture_get_extension_index();
-
- bt = begin_task->extensions[index];
-
- /*
* The task pointers may not be known as the task may have
* been created before the capture engine was open. Add them.
*/
- if (bt == NULL)
- bt = rtems_capture_create_capture_task (begin_task);
+ if (!rtems_capture_task_recorded (bt))
+ rtems_capture_record_task (bt);
if (rtems_capture_trigger (NULL, bt, RTEMS_CAPTURE_BEGIN))
rtems_capture_record (bt, RTEMS_CAPTURE_BEGIN_EVENT);
@@ -319,69 +251,46 @@ rtems_capture_begin_task (rtems_tcb* begin_task)
* returned rather than was deleted.
*/
static void
-rtems_capture_exitted_task (rtems_tcb* exitted_task)
+rtems_capture_exitted_task (rtems_tcb* et)
{
/*
- * Get the capture task control block so we can trace this
- * event.
- */
- rtems_capture_task_t* et;
- int index = rtems_capture_get_extension_index();
-
- et = exitted_task->extensions[index];
-
- /*
* The task pointers may not be known as the task may have
* been created before the capture engine was open. Add them.
*/
- if (et == NULL)
- et = rtems_capture_create_capture_task (exitted_task);
+ if (!rtems_capture_task_recorded (et))
+ rtems_capture_record_task (et);
if (rtems_capture_trigger (NULL, et, RTEMS_CAPTURE_EXITTED))
rtems_capture_record (et, RTEMS_CAPTURE_EXITTED_EVENT);
-
- rtems_capture_task_stack_usage (et);
}
/*
* This function is called when a termination request is identified.
*/
static void
-rtems_capture_terminated_task (rtems_tcb* terminated_task)
+rtems_capture_terminated_task (rtems_tcb* tt)
{
/*
- * Get the capture task control block so we can trace this
- * event.
- */
- rtems_capture_task_t* tt;
- int index = rtems_capture_get_extension_index();
-
- tt = terminated_task->extensions[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_task_recorded (tt))
+ rtems_capture_record_task (tt);
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.
*/
static void
-rtems_capture_switch_task (rtems_tcb* current_task,
- rtems_tcb* heir_task)
+rtems_capture_switch_task (rtems_tcb* ct,
+ rtems_tcb* ht)
{
uint32_t flags = rtems_capture_get_flags();
- int index = rtems_capture_get_extension_index();
/*
* Only perform context switch trace processing if tracing is
@@ -391,33 +300,11 @@ rtems_capture_switch_task (rtems_tcb* current_task,
{
rtems_capture_time_t time;
- /*
- * Get the cpature task control block so we can update the
- * reference and perform any watch or trigger functions.
- * The task pointers may not be known as the task may have
- * been created before the capture engine was open. Add them.
- */
- rtems_capture_task_t* ct;
- rtems_capture_task_t* ht;
-
+ if (!rtems_capture_task_recorded (ct))
+ rtems_capture_record_task (ct);
- if (_States_Is_dormant (current_task->current_state))
- {
- rtems_id ct_id = current_task->Object.id;
- ct = rtems_capture_find_capture_task( ct_id );
- }
- else
- {
- ct = current_task->extensions[index];
-
- if (ct == NULL)
- ct = rtems_capture_create_capture_task (current_task);
- }
-
- ht = heir_task->extensions[index];
-
- if (ht == NULL)
- ht = rtems_capture_create_capture_task (heir_task);
+ if (!rtems_capture_task_recorded (ht))
+ rtems_capture_record_task (ht);
/*
* Update the execution time. Assume the time will not overflow
@@ -425,24 +312,6 @@ rtems_capture_switch_task (rtems_tcb* current_task,
*/
rtems_capture_get_time (&time);
- /*
- * We could end up with null pointers for both the current task
- * and the heir task.
- */
-
- if (ht)
- {
- ht->in++;
- ht->time_in = time;
- }
-
- if (ct)
- {
- ct->out++;
- if (ct->time_in)
- ct->time += time - ct->time_in;
- }
-
if (rtems_capture_trigger (ct, ht, RTEMS_CAPTURE_SWITCH))
{
rtems_capture_record (ct, RTEMS_CAPTURE_SWITCHED_OUT_EVENT);