On Mon, Apr 20, 2015 at 02:05:50PM +0530, Jerin Jacob wrote:

ping

> Adding the the complete git commit log for the commit
> 
> example: timer: remove global variables to share the data between workers.
> use the odp_shared_memory allocater instead to enable the timer example
> to run on baremetal/linux process execution environments.
> 
> 
> On Mon, Apr 20, 2015 at 01:58:01PM +0530, Jerin Jacob wrote:
> > Signed-off-by: Jerin Jacob <jerin.ja...@caviumnetworks.com>
> > ---
> >  example/timer/odp_timer_test.c | 124 
> > +++++++++++++++++++++--------------------
> >  1 file changed, 65 insertions(+), 59 deletions(-)
> > 
> > diff --git a/example/timer/odp_timer_test.c b/example/timer/odp_timer_test.c
> > index 6b60ec4..876bf33 100644
> > --- a/example/timer/odp_timer_test.c
> > +++ b/example/timer/odp_timer_test.c
> > @@ -39,18 +39,21 @@ typedef struct {
> >     int tmo_count;     /**< Timeout count*/
> >  } test_args_t;
> >  
> > -
> > -/** @private Barrier for test synchronisation */
> > -static odp_barrier_t test_barrier;
> > -
> > -/** @private Pool handle */
> > -static odp_pool_t pool;
> > -
> > -/** @private Timer pool handle */
> > -static odp_timer_pool_t tp;
> > -
> > -/** @private Number of timeouts to receive */
> > -static odp_atomic_u32_t remain;
> > +/** @private Helper struct for timers */
> > +struct test_timer {
> > +   odp_timer_t tim;
> > +   odp_event_t ev;
> > +};
> > +
> > +/** Test global variables */
> > +typedef struct {
> > +   test_args_t args;               /**< Test argunments*/
> > +   odp_barrier_t test_barrier;     /**< Barrier for test synchronisation*/
> > +   odp_pool_t pool;                /**< pool handle*/
> > +   odp_timer_pool_t tp;            /**< Timer pool handle*/
> > +   odp_atomic_u32_t remain;        /**< Number of timeouts to receive*/
> > +   struct test_timer tt[256];      /**< Array of all timer helper structs*/
> > +} test_globals_t;
> >  
> >  /** @private Timer set status ASCII strings */
> >  static const char *timerset2str(odp_timer_set_t val)
> > @@ -69,17 +72,9 @@ static const char *timerset2str(odp_timer_set_t val)
> >     }
> >  };
> >  
> > -/** @private Helper struct for timers */
> > -struct test_timer {
> > -   odp_timer_t tim;
> > -   odp_event_t ev;
> > -};
> > -
> > -/** @private Array of all timer helper structs */
> > -static struct test_timer tt[256];
> >  
> >  /** @private test timeout */
> > -static void test_abs_timeouts(int thr, test_args_t *args)
> > +static void test_abs_timeouts(int thr, test_globals_t *gbls)
> >  {
> >     uint64_t period;
> >     uint64_t period_ns;
> > @@ -92,30 +87,30 @@ static void test_abs_timeouts(int thr, test_args_t 
> > *args)
> >  
> >     queue = odp_queue_lookup("timer_queue");
> >  
> > -   period_ns = args->period_us*ODP_TIME_USEC;
> > -   period    = odp_timer_ns_to_tick(tp, period_ns);
> > +   period_ns = gbls->args.period_us*ODP_TIME_USEC;
> > +   period    = odp_timer_ns_to_tick(gbls->tp, period_ns);
> >  
> >     EXAMPLE_DBG("  [%i] period %"PRIu64" ticks,  %"PRIu64" ns\n", thr,
> >                 period, period_ns);
> >  
> >     EXAMPLE_DBG("  [%i] current tick %"PRIu64"\n", thr,
> > -               odp_timer_current_tick(tp));
> > +               odp_timer_current_tick(gbls->tp));
> >  
> > -   ttp = &tt[thr - 1]; /* Thread starts at 1 */
> > -   ttp->tim = odp_timer_alloc(tp, queue, ttp);
> > +   ttp = &gbls->tt[thr];
> > +   ttp->tim = odp_timer_alloc(gbls->tp, queue, ttp);
> >     if (ttp->tim == ODP_TIMER_INVALID) {
> >             EXAMPLE_ERR("Failed to allocate timer\n");
> >             return;
> >     }
> > -   tmo = odp_timeout_alloc(pool);
> > +   tmo = odp_timeout_alloc(gbls->pool);
> >     if (tmo == ODP_TIMEOUT_INVALID) {
> >             EXAMPLE_ERR("Failed to allocate timeout\n");
> >             return;
> >     }
> >     ttp->ev = odp_timeout_to_event(tmo);
> > -   tick = odp_timer_current_tick(tp);
> > +   tick = odp_timer_current_tick(gbls->tp);
> >  
> > -   while ((int)odp_atomic_load_u32(&remain) > 0) {
> > +   while ((int)odp_atomic_load_u32(&gbls->remain) > 0) {
> >             odp_event_t ev;
> >             odp_timer_set_t rc;
> >  
> > @@ -140,7 +135,7 @@ static void test_abs_timeouts(int thr, test_args_t 
> > *args)
> >                     /* Check if odp_schedule() timed out, possibly there
> >                      * are no remaining timeouts to receive */
> >             } while (ev == ODP_EVENT_INVALID &&
> > -                    (int)odp_atomic_load_u32(&remain) > 0);
> > +                    (int)odp_atomic_load_u32(&gbls->remain) > 0);
> >  
> >             if (ev == ODP_EVENT_INVALID)
> >                     break; /* No more timeouts */
> > @@ -161,7 +156,7 @@ static void test_abs_timeouts(int thr, test_args_t 
> > *args)
> >             }
> >             EXAMPLE_DBG("  [%i] timeout, tick %"PRIu64"\n", thr, tick);
> >  
> > -           odp_atomic_dec_u32(&remain);
> > +           odp_atomic_dec_u32(&gbls->remain);
> >     }
> >  
> >     /* Cancel and free last timer used */
> > @@ -187,9 +182,9 @@ static void *run_thread(void *ptr)
> >  {
> >     int thr;
> >     odp_pool_t msg_pool;
> > -   test_args_t *args;
> > +   test_globals_t *gbls;
> >  
> > -   args = ptr;
> > +   gbls = ptr;
> >     thr  = odp_thread_id();
> >  
> >     printf("Thread %i starts on cpu %i\n", thr, odp_cpu_id());
> > @@ -204,9 +199,9 @@ static void *run_thread(void *ptr)
> >             return NULL;
> >     }
> >  
> > -   odp_barrier_wait(&test_barrier);
> > +   odp_barrier_wait(&gbls->test_barrier);
> >  
> > -   test_abs_timeouts(thr, args);
> > +   test_abs_timeouts(thr, gbls);
> >  
> >  
> >     printf("Thread %i exits\n", thr);
> > @@ -308,7 +303,6 @@ static void parse_args(int argc, char *argv[], 
> > test_args_t *args)
> >  int main(int argc, char *argv[])
> >  {
> >     odph_linux_pthread_t thread_tbl[MAX_WORKERS];
> > -   test_args_t args;
> >     int num_workers;
> >     odp_queue_t queue;
> >     uint64_t cycles, ns;
> > @@ -318,14 +312,11 @@ int main(int argc, char *argv[])
> >     odp_timer_pool_info_t tpinfo;
> >     odp_cpumask_t cpumask;
> >     char cpumaskstr[ODP_CPUMASK_STR_SIZE];
> > +   odp_shm_t shm;
> > +   test_globals_t  *gbls;
> >  
> >     printf("\nODP timer example starts\n");
> >  
> > -   memset(&args, 0, sizeof(args));
> > -   parse_args(argc, argv, &args);
> > -
> > -   memset(thread_tbl, 0, sizeof(thread_tbl));
> > -
> >     if (odp_init_global(NULL, NULL)) {
> >             printf("ODP global init failed.\n");
> >             return -1;
> > @@ -348,10 +339,25 @@ int main(int argc, char *argv[])
> >  
> >     printf("\n");
> >  
> > +   /* Reserve memory for test_globals_t from shared mem */
> > +   shm = odp_shm_reserve("shm_test_globals", sizeof(test_globals_t),
> > +                         ODP_CACHE_LINE_SIZE, 0);
> > +   gbls = odp_shm_addr(shm);
> > +
> > +   if (gbls == NULL) {
> > +           EXAMPLE_ERR("Error: shared mem alloc failed.\n");
> > +           return -1;
> > +   }
> > +   memset(gbls, 0, sizeof(test_globals_t));
> > +
> > +   parse_args(argc, argv, &gbls->args);
> > +
> > +   memset(thread_tbl, 0, sizeof(thread_tbl));
> > +
> >     /* Default to system CPU count unless user specified */
> >     num_workers = MAX_WORKERS;
> > -   if (args.cpu_count)
> > -           num_workers = args.cpu_count;
> > +   if (gbls->args.cpu_count)
> > +           num_workers = gbls->args.cpu_count;
> >  
> >     /*
> >      * By default CPU #0 runs Linux kernel background tasks.
> > @@ -364,11 +370,11 @@ int main(int argc, char *argv[])
> >     printf("first CPU:          %i\n", odp_cpumask_first(&cpumask));
> >     printf("cpu mask:           %s\n", cpumaskstr);
> >  
> > -   printf("resolution:         %i usec\n", args.resolution_us);
> > -   printf("min timeout:        %i usec\n", args.min_us);
> > -   printf("max timeout:        %i usec\n", args.max_us);
> > -   printf("period:             %i usec\n", args.period_us);
> > -   printf("timeouts:           %i\n", args.tmo_count);
> > +   printf("resolution:         %i usec\n", gbls->args.resolution_us);
> > +   printf("min timeout:        %i usec\n", gbls->args.min_us);
> > +   printf("max timeout:        %i usec\n", gbls->args.max_us);
> > +   printf("period:             %i usec\n", gbls->args.period_us);
> > +   printf("timeouts:           %i\n", gbls->args.tmo_count);
> >  
> >     /*
> >      * Create pool for timeouts
> > @@ -376,28 +382,28 @@ int main(int argc, char *argv[])
> >     params.tmo.num   = NUM_TMOS;
> >     params.type      = ODP_POOL_TIMEOUT;
> >  
> > -   pool = odp_pool_create("msg_pool", ODP_SHM_NULL, &params);
> > +   gbls->pool = odp_pool_create("msg_pool", ODP_SHM_NULL, &params);
> >  
> > -   if (pool == ODP_POOL_INVALID) {
> > +   if (gbls->pool == ODP_POOL_INVALID) {
> >             EXAMPLE_ERR("Pool create failed.\n");
> >             return -1;
> >     }
> >  
> > -   tparams.res_ns = args.resolution_us*ODP_TIME_USEC;
> > -   tparams.min_tmo = args.min_us*ODP_TIME_USEC;
> > -   tparams.max_tmo = args.max_us*ODP_TIME_USEC;
> > +   tparams.res_ns = gbls->args.resolution_us*ODP_TIME_USEC;
> > +   tparams.min_tmo = gbls->args.min_us*ODP_TIME_USEC;
> > +   tparams.max_tmo = gbls->args.max_us*ODP_TIME_USEC;
> >     tparams.num_timers = num_workers; /* One timer per worker */
> >     tparams.priv = 0; /* Shared */
> >     tparams.clk_src = ODP_CLOCK_CPU;
> > -   tp = odp_timer_pool_create("timer_pool", &tparams);
> > -   if (tp == ODP_TIMER_POOL_INVALID) {
> > +   gbls->tp = odp_timer_pool_create("timer_pool", &tparams);
> > +   if (gbls->tp == ODP_TIMER_POOL_INVALID) {
> >             EXAMPLE_ERR("Timer pool create failed.\n");
> >             return -1;
> >     }
> >     odp_timer_pool_start();
> >  
> >     odp_shm_print_all();
> > -   (void)odp_timer_pool_info(tp, &tpinfo);
> > +   (void)odp_timer_pool_info(gbls->tp, &tpinfo);
> >     printf("Timer pool\n");
> >     printf("----------\n");
> >     printf("  name: %s\n", tpinfo.name);
> > @@ -442,14 +448,14 @@ int main(int argc, char *argv[])
> >     printf("\n");
> >  
> >     /* Initialize number of timeouts to receive */
> > -   odp_atomic_init_u32(&remain, args.tmo_count * num_workers);
> > +   odp_atomic_init_u32(&gbls->remain, gbls->args.tmo_count * num_workers);
> >  
> >     /* Barrier to sync test case execution */
> > -   odp_barrier_init(&test_barrier, num_workers);
> > +   odp_barrier_init(&gbls->test_barrier, num_workers);
> >  
> >     /* Create and launch worker threads */
> >     odph_linux_pthread_create(thread_tbl, &cpumask,
> > -                             run_thread, &args);
> > +                             run_thread, gbls);
> >  
> >     /* Wait for worker threads to exit */
> >     odph_linux_pthread_join(thread_tbl, num_workers);
> > -- 
> > 2.1.0
> > 
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to