24 #include <odp/helper/odph_api.h> 
   26 #define PROG_NAME "odp_timer_stress" 
   28 #define MAX_WORKERS ((uint32_t)(ODP_THREAD_COUNT_MAX - 1)) 
   29 #define MULTIPLIER 50U 
   32 #define WAIT_MULTIPLIER 100U 
   34 #define GIGAS 1000000000U 
   35 #define MEGAS 1000000U 
   49 #define DEF_MODE SINGLE_SHOT 
   50 #define DEF_CLK_SRC ODP_CLOCK_DEFAULT 
   51 #define DEF_RES 1000000U 
   52 #define DEF_TIMERS 50U 
   53 #define DEF_POLICY SHARED_TMR 
   55 #define DEF_WORKERS 1U 
   71 typedef struct prog_config_s prog_config_t;
 
   91     prog_config_t *prog_config;
 
   92     uint32_t num_boot_tmr;
 
  102     uint32_t num_workers;
 
  105 typedef struct prog_config_s {
 
  106     odph_thread_t thread_tbl[MAX_WORKERS];
 
  107     worker_config_t worker_config[MAX_WORKERS];
 
  123 static prog_config_t *prog_conf;
 
  130 static void init_config(prog_config_t *config)
 
  134     worker_config_t *worker;
 
  136     opts.mode = DEF_MODE;
 
  137     opts.clk_src = DEF_CLK_SRC;
 
  138     opts.res_ns = DEF_RES;
 
  139     opts.num_tmr = DEF_TIMERS;
 
  140     opts.policy = DEF_POLICY;
 
  141     opts.time_sec = DEF_TIME;
 
  142     opts.num_workers = DEF_WORKERS;
 
  148         if (opts.mode == SINGLE_SHOT || opts.mode == CANCEL) {
 
  156     for (uint32_t i = 0U; i < MAX_WORKERS; ++i) {
 
  157         worker = &config->worker_config[i];
 
  162     config->def_opts = opts;
 
  163     config->opts = config->def_opts;
 
  170 static void print_usage(
const opts_t *opts)
 
  173            "Stress test for benchmarking timer related handling performance in different\n" 
  176            "Usage: " PROG_NAME 
" [OPTIONS]\n");
 
  178            "  E.g. " PROG_NAME 
" -m 0 -n 20\n" 
  179            "       " PROG_NAME 
" -m 2 -p 1 -t 5 -c 4\n");
 
  181            "Optional OPTIONS:\n" 
  183            "  -m, --mode         Timer mode. %u by default. Modes:\n" 
  186            "                         2: single shot with cancel\n" 
  187            "  -s, --clock_source Clock source. Use 'odp_timer_clk_src_t' enumeration values.\n" 
  189            "  -r, --resolution   Timer resolution in nanoseconds. %" PRIu64 
" by default.\n" 
  190            "  -n, --num_timer    Number of timers. %u by default.\n" 
  191            "  -p, --policy       Timer sharing policy. %u by default. Policies:\n" 
  192            "                         0: Timers shared by workers\n" 
  193            "                         1: Private timers per worker\n" 
  194            "  -t, --time_sec     Time in seconds to run. 0 means infinite. %u by default.\n" 
  195            "  -c, --worker_count Number of workers. %u by default.\n" 
  196            "  -h, --help         This help.\n" 
  197            "\n", opts->mode, opts->clk_src, opts->res_ns, opts->num_tmr, opts->policy,
 
  198            opts->time_sec, opts->num_workers);
 
  209     fract.
numer = (uint64_t)(leftover * DEF_RES);
 
  210     fract.
denom = fract.
numer == 0U ? 0U : DEF_RES;
 
  215 static parse_result_t check_options(prog_config_t *config)
 
  217     opts_t *opts = &config->opts;
 
  220     uint32_t req_tmr, max_workers, req_shm;
 
  222     double hz_d, min_hz_d, max_hz_d;
 
  227     if (opts->mode != SINGLE_SHOT && opts->mode != PERIODIC && opts->mode != CANCEL) {
 
  228         ODPH_ERR(
"Invalid timer mode: %u\n", opts->mode);
 
  232     if (opts->policy != SHARED_TMR && opts->policy != PRIV_TMR) {
 
  233         ODPH_ERR(
"Invalid pool policy: %d\n", opts->policy);
 
  237     if (opts->mode == CANCEL && opts->policy != PRIV_TMR) {
 
  238         ODPH_ERR(
"Single shot with cancel mode supported only with worker-private " 
  246         ODPH_ERR(
"Error querying timer capabilities\n");
 
  251         ODPH_ERR(
"Invalid clock source: %d\n", opts->clk_src);
 
  256         ODPH_ERR(
"Invalid queue support, scheduled completion queues not supported\n");
 
  261         ODPH_ERR(
"Invalid resolution: %" PRIu64 
" ns (max: %" PRIu64 
" ns)\n",
 
  266     if (opts->num_tmr == 0U) {
 
  267         ODPH_ERR(
"Invalid number of timers: %u\n", opts->num_tmr);
 
  273     if (opts->num_workers == 0U || opts->num_workers > max_workers) {
 
  274         ODPH_ERR(
"Invalid worker count: %u (min: 1, max: %u)\n", opts->num_workers,
 
  281     req_tmr = opts->num_tmr * (opts->policy == PRIV_TMR ? opts->num_workers : 1U);
 
  283     if (opts->mode == SINGLE_SHOT || opts->mode == CANCEL) {
 
  285             ODPH_ERR(
"Single shot timers not supported\n");
 
  290             ODPH_ERR(
"Invalid number of timers: %u (max: %u)\n", req_tmr,
 
  295         config->res_capa.res_ns = opts->res_ns;
 
  298             ODPH_ERR(
"Error querying timer resolution capabilities\n");
 
  302         if (opts->mode == CANCEL) {
 
  304                 ODPH_ERR(
"Error querying SHM capabilities");
 
  313                 ODPH_ERR(
"Invalid SHM block count support: %u (max: %u)\n",
 
  321                      opts->num_tmr * opts->num_workers;
 
  324                 ODPH_ERR(
"Invalid total SHM block size: %" PRIu64 
"" 
  325                      " (max: %" PRIu64 
")\n", req_shm_sz, shm_capa.
max_size);
 
  331             ODPH_ERR(
"Periodic timers not supported\n");
 
  336             ODPH_ERR(
"Invalid number of timers: %u (max: %u)\n", req_tmr,
 
  341         hz = calc_req_hz(opts->res_ns);
 
  346         if (hz_d < min_hz_d || hz_d > max_hz_d) {
 
  347             ODPH_ERR(
"Invalid requested resolution: %." FMT_RES 
"f hz " 
  348                  "(min: %." FMT_RES 
"f hz, max: %." FMT_RES 
"f hz)\n", hz_d,
 
  353         config->per_capa.base_freq_hz = hz;
 
  354         config->per_capa.max_multiplier = MULTIPLIER;
 
  355         config->per_capa.res_ns = opts->res_ns;
 
  358             ODPH_ERR(
"Error querying periodic timer capabilities\n");
 
  362         if (config->per_capa.max_multiplier > MULTIPLIER)
 
  363             config->per_capa.max_multiplier = MULTIPLIER;
 
  367         ODPH_ERR(
"Error querying pool capabilities\n");
 
  372         ODPH_ERR(
"Invalid timeout event count: %u (max: %u)\n", req_tmr,
 
  380 static parse_result_t parse_options(
int argc, 
char **argv, prog_config_t *config)
 
  383     opts_t *opts = &config->opts;
 
  385     static const struct option longopts[] = {
 
  386         { 
"mode", required_argument, NULL, 
'm' },
 
  387         { 
"clock_source", required_argument, NULL, 
's' },
 
  388         { 
"resolution", required_argument, NULL, 
'r' },
 
  389         { 
"num_timer", required_argument, NULL, 
'n' },
 
  390         { 
"policy", required_argument, NULL, 
'p' },
 
  391         { 
"time_sec", required_argument, NULL, 
't' },
 
  392         { 
"worker_count", required_argument, NULL, 
'c' },
 
  393         { 
"help", no_argument, NULL, 
'h' },
 
  397     static const char *shortopts = 
"m:s:r:n:p:t:c:h";
 
  402         opt = getopt_long(argc, argv, shortopts, longopts, NULL);
 
  409             opts->mode = atoi(optarg);
 
  412             opts->clk_src = atoi(optarg);
 
  415             opts->res_ns = atoll(optarg);
 
  418             opts->num_tmr = atoi(optarg);
 
  421             opts->policy = atoi(optarg);
 
  424             opts->time_sec = atoi(optarg);
 
  427             opts->num_workers = atoi(optarg);
 
  430             print_usage(&config->def_opts);
 
  434             print_usage(&config->def_opts);
 
  439     return check_options(config);
 
  442 static parse_result_t setup_program(
int argc, 
char **argv, prog_config_t *config)
 
  444     struct sigaction action = { .sa_handler = terminate };
 
  448     if (sigemptyset(&action.sa_mask) == -1 || sigaddset(&action.sa_mask, SIGINT) == -1 ||
 
  449         sigaddset(&action.sa_mask, SIGTERM) == -1 ||
 
  450         sigaddset(&action.sa_mask, SIGHUP) == -1 || sigaction(SIGINT, &action, NULL) == -1 ||
 
  451         sigaction(SIGTERM, &action, NULL) == -1 || sigaction(SIGHUP, &action, NULL) == -1) {
 
  452         ODPH_ERR(
"Error installing signal handler\n");
 
  456     return parse_options(argc, argv, config);
 
  466         ODPH_ERR(
"Error creating timer pool\n");
 
  471         ODPH_ERR(
"Error starting timer pool\n");
 
  478 static odp_bool_t setup_config(prog_config_t *config)
 
  480     opts_t *opts = &config->opts;
 
  481     odp_bool_t is_priv = opts->policy == PRIV_TMR;
 
  482     const uint32_t num_barrier = opts->num_workers + 1,
 
  483     max_tmr = opts->num_tmr * (is_priv ? opts->num_workers : 1U),
 
  489     void *cancel_addr = NULL;
 
  490     uint32_t num_tmr_p_w = ODPH_DIV_ROUNDUP(opts->num_tmr, opts->num_workers),
 
  491     num_tmr = opts->num_tmr;
 
  492     worker_config_t *worker;
 
  495         ODPH_ERR(
"Error initializing scheduler\n");
 
  503     tmo_param.
tmo.
num = max_tmr;
 
  508         ODPH_ERR(
"Error creating timeout pool\n");
 
  513     tmr_param.
clk_src = opts->clk_src;
 
  514     tmr_param.
res_ns = opts->res_ns;
 
  517     if (opts->mode == SINGLE_SHOT || opts->mode == CANCEL) {
 
  519         tmr_param.
min_tmo = config->res_capa.min_tmo;
 
  520         tmr_param.
max_tmo = config->res_capa.max_tmo;
 
  527     config->tmr_pool = create_timer_pool(&tmr_param);
 
  537     if (is_priv && opts->mode == CANCEL) {
 
  539                              ODP_CACHE_LINE_SIZE, 0U);
 
  542             ODPH_ERR(
"Error reserving SHM for cancel mode\n");
 
  548         if (cancel_addr == NULL) {
 
  549             ODPH_ERR(
"Error resolving SHM address for cancel mode\n");
 
  554     for (uint32_t i = 0U; i < opts->num_workers; ++i) {
 
  555         worker = &config->worker_config[i];
 
  556         worker->num_boot_tmr = num_tmr_p_w;
 
  557         num_tmr -= num_tmr_p_w;
 
  559         if (num_tmr < num_tmr_p_w)
 
  560             num_tmr_p_w = num_tmr;
 
  563             worker->num_boot_tmr = opts->num_tmr;
 
  565             if (opts->mode == CANCEL)
 
  566                 worker->cancel.tmrs =
 
  567                   (tmr_hdls_t *)(uintptr_t)((uint8_t *)(uintptr_t)cancel_addr + i *
 
  568                   worker->num_boot_tmr * tmr_size);
 
  573                 ODPH_ERR(
"Error creating schedule group for worker %u\n", i);
 
  583             ODPH_ERR(
"Error creating completion queue for worker %u\n", i);
 
  587         worker->prog_config = config;
 
  602         ODPH_ABORT(
"Error allocating timers, aborting (tmr: %" PRIx64 
", " 
  611         ODPH_ABORT(
"Error allocating timeouts, aborting (tmo: %" PRIx64 
", " 
  615     time.is_running = 
true;
 
  621                      uint64_t res_ns, stats_t *stats)
 
  624     uint32_t retry = MAX_RETRY, mul = 1U;
 
  643         ODPH_ABORT(
"Error starting timers, aborting (tmr: %" PRIx64 
", tmr pool: " 
  648     stats->max_mul = mul > stats->max_mul ? mul : stats->max_mul;
 
  651 static void boot_single_shot(worker_config_t *worker, 
odp_timer_pool_t tmr_pool,
 
  656     for (uint32_t i = 0U; i < worker->num_boot_tmr; ++i) {
 
  657         time = get_time_handles(tmr_pool, tmo_pool, worker->scd.q);
 
  663 static int process_single_shot(
void *args)
 
  665     worker_config_t *worker = args;
 
  667     prog_config_t *config = worker->prog_config;
 
  669     const uint64_t res_ns = prog_conf->opts.res_ns;
 
  674     stats_t *stats = &worker->stats;
 
  681             ODPH_ABORT(
"Error joining scheduler group, aborting (group: %" PRIu64 
")" 
  685     boot_single_shot(worker, tmr_pool, config->tmo_pool, res_ns);
 
  696         start_single_shot(tmr_pool, tmr, ev, res_ns, stats);
 
  727         ODPH_ABORT(
"Error starting timer, aborting (tmr: %" PRIx64 
", tmr pool: " 
  737     for (uint32_t i = 0U; i < worker->num_boot_tmr; ++i) {
 
  738         time = get_time_handles(tmr_pool, tmo_pool, worker->scd.q);
 
  743 static int process_periodic(
void *args)
 
  745     worker_config_t *worker = args;
 
  747     prog_config_t *config = worker->prog_config;
 
  752     stats_t *stats = &worker->stats;
 
  753     const uint64_t res_ns = prog_conf->opts.res_ns;
 
  761             ODPH_ABORT(
"Error joining scheduler group, aborting (group: %" PRIu64 
")" 
  765     boot_periodic(worker, config->tmr_pool, config->tmo_pool, config->per_capa.max_multiplier);
 
  778             ODPH_ABORT(
"Error acking periodic timer, aborting (tmr: %" PRIx64 
")\n",
 
  789                                    config->per_capa.max_multiplier *
 
  801             ODPH_ABORT(
"Error acking periodic timer, aborting (tmr: %" PRIx64 
")\n",
 
  817             ODPH_ABORT(
"Error cancelling periodic timer, aborting " 
  831     for (uint32_t i = 0U; i < worker->num_boot_tmr; ++i) {
 
  832         time = get_time_handles(tmr_pool, tmo_pool, worker->scd.q);
 
  835         worker->cancel.tmrs[i] = time;
 
  839 static int process_cancel(
void *args)
 
  841     worker_config_t *worker = args;
 
  843     prog_config_t *config = worker->prog_config;
 
  845     const uint64_t res_ns = prog_conf->opts.res_ns;
 
  849     stats_t *stats = &worker->stats;
 
  850     const uint32_t num_boot_tmr = worker->num_boot_tmr;
 
  859         ODPH_ABORT(
"Error joining scheduler group, aborting (group: %" PRIu64 
")\n",
 
  862     boot_cancel(worker, tmr_pool, config->tmo_pool, res_ns);
 
  876         for (uint32_t i = 0U; i < num_boot_tmr; ++i) {
 
  877             time = &worker->cancel.tmrs[i];
 
  884                 ODPH_ABORT(
"Error cancelling timer, aborting (tmr: %" PRIx64 
")\n",
 
  887             time->is_running = 
false;
 
  891         for (uint32_t i = 0U; i < num_boot_tmr; ++i) {
 
  892             time = &worker->cancel.tmrs[i];
 
  894             if (time->is_running)
 
  899             time->is_running = 
true;
 
  921 static odp_bool_t setup_workers(prog_config_t *config)
 
  923     odph_thread_common_param_t thr_common;
 
  924     odph_thread_param_t thr_params[config->opts.num_workers], *thr_param;
 
  925     worker_config_t *worker;
 
  926     const uint32_t mode = config->opts.mode;
 
  927     int (*start_fn)(
void *) = mode == SINGLE_SHOT ? process_single_shot :
 
  928                     mode == PERIODIC ? process_periodic : process_cancel;
 
  930     odph_thread_common_param_init(&thr_common);
 
  931     thr_common.instance = config->odp_instance;
 
  932     thr_common.cpumask = &config->worker_mask;
 
  934     for (uint32_t i = 0; i < config->opts.num_workers; ++i) {
 
  935         thr_param = &thr_params[i];
 
  936         worker = &config->worker_config[i];
 
  937         odph_thread_param_init(thr_param);
 
  938         thr_param->start = start_fn;
 
  940         thr_param->arg = worker;
 
  943     if ((uint32_t)odph_thread_create(config->thread_tbl, &thr_common, thr_params,
 
  944                      config->opts.num_workers) != config->opts.num_workers) {
 
  945         ODPH_ERR(
"Error configuring worker threads\n");
 
  952 static odp_bool_t setup_test(prog_config_t *config)
 
  954     return setup_config(config) && setup_workers(config);
 
  957 static void run_control(prog_config_t *config)
 
  959     const uint32_t time_sec = config->opts.time_sec;
 
  973     (void)odph_thread_join(config->thread_tbl, config->opts.num_workers);
 
  976 static void print_humanised(uint64_t value)
 
  979         printf(
"%.2f GOPS\n", (
double)value / GIGAS);
 
  980     else if (value > MEGAS)
 
  981         printf(
"%.2f MOPS\n", (
double)value / MEGAS);
 
  982     else if (value > KILOS)
 
  983         printf(
"%.2f kOPS\n", (
double)value / KILOS);
 
  985         printf(
"%" PRIu64 
" OPS\n", value);
 
  988 static void print_stats(
const prog_config_t *config)
 
  990     const stats_t *stats;
 
  991     const opts_t *opts = &config->opts;
 
  992     uint64_t tot_tmo = 0U, tot_miss = 0U, tot_retry = 0U, max_mul = 0U, rate, tot_rate = 0U;
 
  994     printf(
"=====================\n\n" 
  995            "" PROG_NAME 
" done\n\n" 
  997            "  clock source:     %d\n" 
  998            "  resolution:       %" PRIu64 
" ns\n" 
  999            "  number of timers: %u (%s)\n\n", opts->mode == SINGLE_SHOT ? 
"single shot" :
 
 1000                             opts->mode == PERIODIC ?
 
 1001                                 "periodic" : 
"single shot with cancel",
 
 1002            opts->clk_src, opts->res_ns, opts->num_tmr,
 
 1003            opts->policy == SHARED_TMR ? 
"shared" : 
"private");
 
 1005     for (uint32_t i = 0U; i < config->opts.num_workers; ++i) {
 
 1006         stats = &config->worker_config[i].stats;
 
 1007         tot_tmo += stats->num_tmo;
 
 1008         tot_miss += stats->num_miss;
 
 1009         tot_retry += stats->num_retry;
 
 1010         max_mul = ODPH_MAX(max_mul, stats->max_mul);
 
 1014         printf(
"  worker %u:\n" 
 1015                "    %s%" PRIu64 
"\n", i,
 
 1016                opts->mode == SINGLE_SHOT || opts->mode == PERIODIC ?
 
 1017             "number of timeouts: " : 
"number of cancels:  ",
 
 1020         if (opts->mode == SINGLE_SHOT || opts->mode == CANCEL) {
 
 1021             if (opts->mode == CANCEL)
 
 1022                 printf(
"    number of misses:   %" PRIu64 
"\n", stats->num_miss);
 
 1024             printf(
"    number of retries:  %" PRIu64 
"\n" 
 1025                    "    max start mul:      %" PRIu64 
"\n", stats->num_retry,
 
 1029         printf(
"    runtime:            %" PRIu64 
" ns\n" 
 1030                "    rate:               ", stats->tot_tm);
 
 1031         print_humanised(rate);
 
 1036            "    %s%" PRIu64 
"\n", opts->mode == SINGLE_SHOT || opts->mode == PERIODIC ?
 
 1037                     "number of timeouts: " : 
"number of cancels:  ",
 
 1040     if (opts->mode == SINGLE_SHOT || opts->mode == CANCEL) {
 
 1041         if (opts->mode == CANCEL)
 
 1042             printf(
"    number of misses:   %" PRIu64 
"\n", tot_miss);
 
 1044         printf(
"    number of retries:  %" PRIu64 
"\n" 
 1045                "    max start mul:      %" PRIu64 
"\n", tot_retry, max_mul);
 
 1049     print_humanised(tot_rate);
 
 1050     printf(
"\n=====================\n");
 
 1053 static void teardown(
const prog_config_t *config)
 
 1055     const opts_t *opts = &config->opts;
 
 1056     const worker_config_t *worker;
 
 1058     for (uint32_t i = 0U; i < opts->num_workers; ++i) {
 
 1059         worker = &config->worker_config[i];
 
 1078 int main(
int argc, 
char **argv)
 
 1080     odph_helper_options_t odph_opts;
 
 1084     int ret = EXIT_SUCCESS;
 
 1085     parse_result_t parse_res;
 
 1087     argc = odph_parse_options(argc, argv);
 
 1089     if (odph_options(&odph_opts) == -1)
 
 1090         ODPH_ABORT(
"Error while reading ODP helper options, aborting\n");
 
 1093     init_param.
mem_model = odph_opts.mem_model;
 
 1096         ODPH_ABORT(
"ODP global init failed, aborting\n");
 
 1099         ODPH_ABORT(
"ODP local init failed, aborting\n");
 
 1101     shm_cfg = 
odp_shm_reserve(PROG_NAME 
"_cfg", 
sizeof(prog_config_t), ODP_CACHE_LINE_SIZE,
 
 1105         ODPH_ERR(
"Error reserving shared memory\n");
 
 1112     if (prog_conf == NULL) {
 
 1113         ODPH_ERR(
"Error resolving shared memory address\n");
 
 1118     memset(prog_conf, 0, 
sizeof(*prog_conf));
 
 1120     parse_res = setup_program(argc, argv, prog_conf);
 
 1122     if (parse_res == PRS_NOK) {
 
 1127     if (parse_res == PRS_TERM) {
 
 1132     if (!setup_test(prog_conf)) {
 
 1137     run_control(prog_conf);
 
 1138     print_stats(prog_conf);
 
 1141     teardown(prog_conf);
 
 1147         ODPH_ABORT(
"ODP local terminate failed, aborting\n");
 
 1150         ODPH_ABORT(
"ODP global terminate failed, aborting\n");
 
void odp_atomic_init_u32(odp_atomic_u32_t *atom, uint32_t val)
Initialize atomic uint32 variable.
 
uint32_t odp_atomic_load_u32(odp_atomic_u32_t *atom)
Load value of atomic uint32 variable.
 
void odp_atomic_store_u32(odp_atomic_u32_t *atom, uint32_t val)
Store value to atomic uint32 variable.
 
void odp_barrier_init(odp_barrier_t *barr, int count)
Initialize barrier with thread count.
 
void odp_barrier_wait(odp_barrier_t *barr)
Synchronize thread execution on barrier.
 
#define ODP_ALIGNED_CACHE
Defines type/struct/variable to be cache line size aligned.
 
#define odp_unlikely(x)
Branch unlikely taken.
 
#define ODP_UNUSED
Intentionally unused variables of functions.
 
#define ODP_CACHE_LINE_ROUNDUP(x)
Round up to cache line size.
 
int odp_cpumask_default_worker(odp_cpumask_t *mask, int num)
Default CPU mask for worker threads.
 
void odp_event_free(odp_event_t event)
Free event.
 
#define ODP_EVENT_INVALID
Invalid event.
 
int odp_instance(odp_instance_t *instance)
Get instance handle.
 
void odp_init_param_init(odp_init_t *param)
Initialize the odp_init_t to default values for all fields.
 
int odp_init_local(odp_instance_t instance, odp_thread_type_t thr_type)
Thread local ODP initialization.
 
int odp_init_global(odp_instance_t *instance, const odp_init_t *params, const odp_platform_init_t *platform_params)
Global ODP initialization.
 
int odp_term_local(void)
Thread local ODP termination.
 
int odp_term_global(odp_instance_t instance)
Global ODP termination.
 
uint64_t odp_instance_t
ODP instance ID.
 
void odp_spinlock_lock(odp_spinlock_t *splock)
Acquire spin lock.
 
void odp_spinlock_init(odp_spinlock_t *splock)
Initialize spin lock.
 
void odp_spinlock_unlock(odp_spinlock_t *splock)
Release spin lock.
 
uint64_t odp_pool_to_u64(odp_pool_t hdl)
Get printable value for an odp_pool_t.
 
odp_pool_t odp_pool_create(const char *name, const odp_pool_param_t *param)
Create a pool.
 
int odp_pool_capability(odp_pool_capability_t *capa)
Query pool capabilities.
 
void odp_pool_param_init(odp_pool_param_t *param)
Initialize pool params.
 
int odp_pool_destroy(odp_pool_t pool)
Destroy a pool previously created by odp_pool_create()
 
#define ODP_POOL_INVALID
Invalid pool.
 
@ ODP_POOL_TIMEOUT
Timeout pool.
 
void odp_queue_param_init(odp_queue_param_t *param)
Initialize queue params.
 
#define ODP_QUEUE_INVALID
Invalid queue.
 
odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param)
Queue create.
 
int odp_queue_destroy(odp_queue_t queue)
Destroy ODP queue.
 
@ ODP_QUEUE_TYPE_SCHED
Scheduled queue.
 
int odp_schedule_group_t
Scheduler thread group.
 
int odp_schedule_group_join(odp_schedule_group_t group, const odp_thrmask_t *mask)
Join a schedule group.
 
int odp_schedule_group_destroy(odp_schedule_group_t group)
Schedule group destroy.
 
#define ODP_SCHED_GROUP_INVALID
Invalid scheduler group.
 
#define ODP_SCHED_NO_WAIT
Do not wait.
 
int odp_schedule_default_prio(void)
Default scheduling priority level.
 
int odp_schedule_config(const odp_schedule_config_t *config)
Global schedule configuration.
 
uint64_t odp_schedule_group_to_u64(odp_schedule_group_t group)
Get printable value for schedule group handle.
 
uint64_t odp_schedule_wait_time(uint64_t ns)
Schedule wait time.
 
odp_schedule_group_t odp_schedule_group_create(const char *name, const odp_thrmask_t *mask)
Schedule group create.
 
odp_event_t odp_schedule(odp_queue_t *from, uint64_t wait)
Schedule an event.
 
int odp_shm_free(odp_shm_t shm)
Free a contiguous block of shared memory.
 
#define ODP_SHM_INVALID
Invalid shared memory block.
 
int odp_shm_capability(odp_shm_capability_t *capa)
Query shared memory capabilities.
 
void * odp_shm_addr(odp_shm_t shm)
Shared memory block address.
 
odp_shm_t odp_shm_reserve(const char *name, uint64_t size, uint64_t align, uint32_t flags)
Reserve a contiguous block of shared memory.
 
bool odp_bool_t
Boolean type.
 
double odp_fract_u64_to_dbl(const odp_fract_u64_t *fract)
Convert fractional number (u64) to double.
 
void odp_thrmask_set(odp_thrmask_t *mask, int thr)
Add thread to mask.
 
int odp_thread_id(void)
Get thread identifier.
 
void odp_thrmask_zero(odp_thrmask_t *mask)
Clear entire thread mask.
 
@ ODP_THREAD_WORKER
Worker thread.
 
@ ODP_THREAD_CONTROL
Control thread.
 
#define ODP_TIME_SEC_IN_NS
A second in nanoseconds.
 
odp_time_t odp_time_local_strict(void)
Current local time (strict)
 
uint64_t odp_time_diff_ns(odp_time_t t2, odp_time_t t1)
Time difference in nanoseconds.
 
int odp_timer_pool_start_multi(odp_timer_pool_t timer_pool[], int num)
Start timer pools.
 
odp_timeout_t odp_timeout_alloc(odp_pool_t pool)
Timeout alloc.
 
int odp_timer_free(odp_timer_t timer)
Free a timer.
 
int odp_timer_periodic_start(odp_timer_t timer, const odp_timer_periodic_start_t *start_param)
Start a periodic timer.
 
odp_timeout_t odp_timeout_from_event(odp_event_t ev)
Get timeout handle from a ODP_EVENT_TIMEOUT type event.
 
#define ODP_TIMER_POOL_INVALID
Invalid timer pool handle.
 
int odp_timer_periodic_capability(odp_timer_clk_src_t clk_src, odp_timer_periodic_capability_t *capa)
Periodic timer capability.
 
odp_timer_pool_t odp_timer_pool_create(const char *name, const odp_timer_pool_param_t *params)
Create a timer pool.
 
odp_timer_t odp_timeout_timer(odp_timeout_t tmo)
Return timer handle for the timeout.
 
int odp_timer_cancel(odp_timer_t timer, odp_event_t *tmo_ev)
Cancel a timer.
 
int odp_timer_capability(odp_timer_clk_src_t clk_src, odp_timer_capability_t *capa)
Query timer capabilities per clock source.
 
uint64_t odp_timer_ns_to_tick(odp_timer_pool_t timer_pool, uint64_t ns)
Convert nanoseconds to timer ticks.
 
int odp_timer_periodic_ack(odp_timer_t timer, odp_event_t tmo_ev)
Acknowledge timeout from a periodic timer.
 
uint64_t odp_timeout_to_u64(odp_timeout_t tmo)
Get printable value for an odp_timeout_t.
 
odp_timer_clk_src_t
Clock sources for timer pools.
 
int odp_timer_start(odp_timer_t timer, const odp_timer_start_t *start_param)
Start a timer.
 
int odp_timer_res_capability(odp_timer_clk_src_t clk_src, odp_timer_res_capability_t *res_capa)
Timer resolution capability.
 
int odp_timer_periodic_cancel(odp_timer_t timer)
Cancel a periodic timer.
 
odp_event_t odp_timeout_to_event(odp_timeout_t tmo)
Convert timeout handle to event handle.
 
#define ODP_TIMEOUT_INVALID
Invalid timeout handle.
 
odp_timer_t odp_timer_alloc(odp_timer_pool_t timer_pool, odp_queue_t queue, const void *user_ptr)
Allocate a timer.
 
uint64_t odp_timer_pool_to_u64(odp_timer_pool_t timer_pool)
Get printable value for an odp_timer_pool_t.
 
#define ODP_TIMER_INVALID
Invalid timer handle.
 
uint64_t odp_timer_to_u64(odp_timer_t timer)
Get printable value for an odp_timer_t.
 
void odp_timer_pool_param_init(odp_timer_pool_param_t *param)
Initialize timer pool parameters.
 
void odp_timer_pool_destroy(odp_timer_pool_t timer_pool)
Destroy a timer pool.
 
@ ODP_TIMER_SUCCESS
Timer operation succeeded.
 
@ ODP_TIMER_TOO_NEAR
Timer operation failed, too near to the current time.
 
@ ODP_TIMER_FAIL
Timer operation failed.
 
@ ODP_TIMER_TYPE_PERIODIC
Periodic timer.
 
@ ODP_TIMER_TYPE_SINGLE
Single shot timer.
 
@ ODP_TIMER_TICK_REL
Relative ticks.
 
Unsigned 64 bit fractional number.
 
uint64_t integer
Integer part.
 
uint64_t denom
Denominator of the fraction part.
 
uint64_t numer
Numerator of the fraction part.
 
Global initialization parameters.
 
odp_mem_model_t mem_model
Application memory model.
 
uint32_t max_num
Maximum number of buffers of any size.
 
struct odp_pool_capability_t::@134 tmo
Timeout pool capabilities
 
struct odp_pool_param_t::@139 tmo
Parameters for timeout pools.
 
uint32_t num
Number of buffers in the pool.
 
uint32_t cache_size
Maximum number of buffers cached locally per thread.
 
odp_pool_type_t type
Pool type.
 
odp_schedule_param_t sched
Scheduler parameters.
 
odp_queue_type_t type
Queue type.
 
odp_schedule_group_t group
Thread group.
 
odp_schedule_prio_t prio
Priority level.
 
Shared memory capabilities.
 
uint32_t max_blocks
Maximum number of shared memory blocks.
 
uint64_t max_size
Maximum memory block size in bytes.
 
odp_fract_u64_t min_base_freq_hz
Minimum supported base frequency value.
 
uint32_t max_timers
Maximum number of single shot timers in a pool.
 
uint32_t max_pools
Maximum number of timer pools for single shot timers (per clock source)
 
odp_fract_u64_t max_base_freq_hz
Maximum supported base frequency value.
 
struct odp_timer_capability_t::@180 periodic
Periodic timer capabilities.
 
uint64_t highest_res_ns
Highest timer resolution in nanoseconds.
 
odp_bool_t queue_type_sched
Scheduled queue destination support.
 
Periodic timer capability.
 
Periodic timer start parameters.
 
uint64_t res_ns
Timeout resolution in nanoseconds.
 
odp_timer_type_t timer_type
Timer type.
 
struct odp_timer_pool_param_t::@181 periodic
Periodic timer parameters.
 
uint64_t max_multiplier
Maximum base frequency multiplier.
 
odp_fract_u64_t base_freq_hz
Timer pool base frequency in hertz.
 
uint64_t min_tmo
Minimum relative timeout in nanoseconds.
 
uint32_t num_timers
Number of timers in the pool.
 
odp_timer_clk_src_t clk_src
Clock source for timers.
 
uint64_t max_tmo
Maximum relative timeout in nanoseconds.
 
Timer resolution capability.
 
uint64_t tick
Expiration time in ticks.
 
odp_event_t tmo_ev
Timeout event.
 
odp_timer_tick_type_t tick_type
Tick type.