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