diff options
Diffstat (limited to 'cpukit/libmisc/capture/capture_user_extension.c')
-rw-r--r-- | cpukit/libmisc/capture/capture_user_extension.c | 219 |
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); |