[PATCH 2/4] capture: Fix capture engine to handle new extensions.

Jennifer Averett Jennifer.Averett at OARcorp.com
Fri Jul 11 11:44:30 UTC 2014



> -----Original Message-----
> From: devel [mailto:devel-bounces at rtems.org] On Behalf Of Chris Johns
> Sent: Thursday, July 10, 2014 8:44 PM
> To: devel at rtems.org
> Subject: Re: [PATCH 2/4] capture: Fix capture engine to handle new
> extensions.
> 
> 
> 
> 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.
> 
Fixed

> >   /*
> >    * 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 ?

This was a comment that slipped in.  It was a note to ask if we should check that
the read and recs parameters were 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;
> >
> >   /**
> >
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel



More information about the devel mailing list