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, ¶ms); > + gbls->pool = odp_pool_create("msg_pool", ODP_SHM_NULL, ¶ms); > > - 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