On 8 January 2015 at 13:55, Savolainen, Petri (NSN - FI/Espoo)
<[email protected]> wrote:
>
>
>> -----Original Message-----
>> From: [email protected] [mailto:lng-odp-
>> [email protected]] On Behalf Of ext Ola Liljedahl
>> Sent: Monday, January 05, 2015 8:24 PM
>> To: [email protected]
>> Subject: [lng-odp] [PATCHv3 2/3] api: odp_timer.h: updated API, lock-less
>> implementation
>>
>> Signed-off-by: Ola Liljedahl <[email protected]>
>>
>> (This document/code contribution attached is provided under the terms of
>> agreement LES-LTM-21309)
>> The timer API is updated according to
>> https://docs.google.com/a/linaro.org/document/d/1bfY_J8ecLJPsFTmYftb0NVmGn
>> B9qkEc_NpcJ87yfaD8
>> A major change is that timers are allocated and freed separately from
>> timeouts being set and cancelled. The life-length of a timer normally
>> corresponds to the life-length of the associated stateful flow while
>> the life-length of a timeout corresponds to individual packets being
>> transmitted and received.
>> The reference timer implementation is lock-less for platforms with
>> support for 128-bit (16-byte) atomic exchange and CAS operations.
>> Otherwise a lock-based implementation (using as many locks as desired)
>> is used but some operations (e.g. reset reusing existing timeout buffer)
>> may still be lock-less.
>> Updated the example example/timer/odp_timer_test.c according to the
>> updated API.
>> Updated the API according to Petri's review comments.
>> ---
>> example/timer/odp_timer_test.c | 177 ++--
>> platform/linux-generic/include/api/odp_timer.h | 318 ++++--
>> .../linux-generic/include/odp_timer_internal.h | 59 +-
>> platform/linux-generic/odp_timer.c | 1064 ++++++++++++++-
>> -----
>> 4 files changed, 1139 insertions(+), 479 deletions(-)
>>
>> diff --git a/example/timer/odp_timer_test.c
>> b/example/timer/odp_timer_test.c
>> index 2acf2fc..71f72b4 100644
>> --- a/example/timer/odp_timer_test.c
>> +++ b/example/timer/odp_timer_test.c
>> @@ -26,7 +26,6 @@
>>
>>
>> #define MAX_WORKERS 32 /**< Max worker threads */
>> -#define MSG_POOL_SIZE (4*1024*1024) /**< Message pool size */
>> #define MSG_NUM_BUFS 10000 /**< Number of timers */
>>
>>
>> @@ -44,69 +43,119 @@ typedef struct {
>> /** @private Barrier for test synchronisation */
>> static odp_barrier_t test_barrier;
>>
>> -/** @private Timer handle*/
>> -static odp_timer_t test_timer;
>> +/** @private Buffer pool handle */
>> +static odp_buffer_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 Timer set status ASCII strings */
>> +static const char *timerset2str(odp_timer_set_t val)
>> +{
>> + switch (val) {
>> + case ODP_TIMER_SET_SUCCESS:
>> + return "success";
>> + case ODP_TIMER_SET_TOOEARLY:
>> + return "too early";
>> + case ODP_TIMER_SET_TOOLATE:
>> + return "too late";
>> + case ODP_TIMER_SET_NOBUF:
>> + return "no buffer";
>> + default:
>> + return "?";
>> + }
>> +};
>> +
>> +/** @private Helper struct for timers */
>> +struct test_timer {
>> + odp_timer_t tim;
>> + odp_buffer_t buf;
>> +};
>> +
>> +/** @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)
>> {
>> - uint64_t tick;
>> uint64_t period;
>> uint64_t period_ns;
>> odp_queue_t queue;
>> - odp_buffer_t buf;
>> - int num;
>> + uint64_t tick;
>> + struct test_timer *ttp;
>>
>> EXAMPLE_DBG(" [%i] test_timeouts\n", thr);
>>
>> queue = odp_queue_lookup("timer_queue");
>>
>> period_ns = args->period_us*ODP_TIME_USEC;
>> - period = odp_timer_ns_to_tick(test_timer, period_ns);
>> + period = odp_timer_ns_to_tick(tp, period_ns);
>>
>> EXAMPLE_DBG(" [%i] period %"PRIu64" ticks, %"PRIu64" ns\n", thr,
>> period, period_ns);
>>
>> - tick = odp_timer_current_tick(test_timer);
>> -
>> - EXAMPLE_DBG(" [%i] current tick %"PRIu64"\n", thr, tick);
>> + EXAMPLE_DBG(" [%i] current tick %"PRIu64"\n", thr,
>> + odp_timer_current_tick(tp));
>>
>> - tick += period;
>> -
>> - if (odp_timer_absolute_tmo(test_timer, tick, queue,
>> ODP_BUFFER_INVALID)
>> - == ODP_TIMER_TMO_INVALID){
>> - EXAMPLE_DBG("Timeout request failed\n");
>> + ttp = &tt[thr - 1]; /* Thread starts at 1 */
>> + ttp->tim = odp_timer_alloc(tp, queue, ttp);
>> + if (ttp->tim == ODP_TIMER_INVALID) {
>> + EXAMPLE_ERR("Failed to allocate timer\n");
>> return;
>> }
>> + ttp->buf = odp_buffer_alloc(pool);
>> + if (ttp->buf == ODP_BUFFER_INVALID) {
>> + EXAMPLE_ERR("Failed to allocate buffer\n");
>> + return;
>> + }
>> + tick = odp_timer_current_tick(tp);
>>
>> - num = args->tmo_count;
>> -
>> - while (1) {
>> - odp_timeout_t tmo;
>> + while ((int)odp_atomic_load_u32(&remain) > 0) {
>> + odp_buffer_t buf;
>> + odp_timer_set_t rc;
>>
>> - buf = odp_schedule_one(&queue, ODP_SCHED_WAIT);
>> + tick += period;
>> + rc = odp_timer_set_abs(ttp->tim, tick, &ttp->buf);
>> + if (odp_unlikely(rc != ODP_TIMER_SET_SUCCESS)) {
>> + /* Too early or too late timeout requested */
>> + EXAMPLE_ABORT("odp_timer_set_abs() failed: %s\n",
>> + timerset2str(rc));
>> + }
>>
>> - tmo = odp_timeout_from_buffer(buf);
>> + /* Get the next expired timeout */
>> + buf = odp_schedule(&queue, ODP_SCHED_WAIT);
>
> It's possible that scheduler gives last N tmos to single thread. In that case
> N other threads are stuck here waiting for ever. You should either poll
> "remain" (with some odp_schedule() wait period) or otherwise ensure that all
> threads are signaled when the test is finished.
OK, call odp_schedule with a timeout and then recheck the remain
variable which ought to be 0 if a thread does not get any more
timeouts.
The while timer example is a bit artificial so these workarounds to
make it behave correctly are not making it look better.
>
>
>> + if (odp_buffer_type(buf) != ODP_BUFFER_TYPE_TIMEOUT) {
>> + /* Not a default timeout buffer */
>> + EXAMPLE_ABORT("Unexpected buffer type (%u) received\n",
>> + odp_buffer_type(buf));
>> + }
>> + odp_timeout_t tmo = odp_timeout_from_buf(buf);
>> tick = odp_timeout_tick(tmo);
>> -
>> + ttp = odp_timeout_user_ptr(tmo);
>> + ttp->buf = buf;
>> + if (!odp_timeout_fresh(tmo)) {
>> + /* Not the expected expiration tick, timer has
>> + * been reset or cancelled or freed */
>> + EXAMPLE_ABORT("Unexpected timeout received (timer %x,
>> tick %"PRIu64")\n",
>> + ttp->tim, tick);
>> + }
>> EXAMPLE_DBG(" [%i] timeout, tick %"PRIu64"\n", thr, tick);
>>
>> - odp_buffer_free(buf);
>> -
>> - num--;
>> -
>> - if (num == 0)
>> - break;
>> -
>> - tick += period;
>> -
>> - odp_timer_absolute_tmo(test_timer, tick,
>> - queue, ODP_BUFFER_INVALID);
>> + odp_atomic_dec_u32(&remain);
>> }
>>
>> - if (odp_queue_sched_type(queue) == ODP_SCHED_SYNC_ATOMIC)
>> - odp_schedule_release_atomic();
>> + /* Cancel and free last timer used */
>> + (void)odp_timer_cancel(ttp->tim, &ttp->buf);
>> + if (ttp->buf != ODP_BUFFER_INVALID)
>> + odp_buffer_free(ttp->buf);
>> + else
>> + EXAMPLE_ERR("Lost timeout buffer at timer cancel\n");
>> + /* Since we have cancelled the timer, there is no timeout buffer to
>> + * return from odp_timer_free() */
>> + (void)odp_timer_free(ttp->tim);
>> }
>>
>
> ...
?
>
>>
>> diff --git a/platform/linux-generic/include/api/odp_timer.h
>> b/platform/linux-generic/include/api/odp_timer.h
>> index 6cca27c..6961e81 100644
>> --- a/platform/linux-generic/include/api/odp_timer.h
>> +++ b/platform/linux-generic/include/api/odp_timer.h
>> @@ -8,7 +8,7 @@
>> /**
>> * @file
>> *
>> - * ODP timer
>> + * ODP timer service
>> */
>>
>> #ifndef ODP_TIMER_H_
>> @@ -18,6 +18,7 @@
>> extern "C" {
>> #endif
>>
>> +#include <stdlib.h>
>> #include <odp_std_types.h>
>> #include <odp_buffer.h>
>> #include <odp_buffer_pool.h>
>> @@ -27,140 +28,335 @@ extern "C" {
>> * @{
>> */
>>
>> +struct odp_timer_pool_s; /**< Forward declaration */
>> +
>> +/**
>> +* ODP timer pool handle (platform dependent)
>> +*/
>> +typedef struct odp_timer_pool_s *odp_timer_pool_t;
>> +
>> /**
>> - * ODP timer handle
>> + * Invalid timer pool handle (platform dependent).
>> */
>> +#define ODP_TIMER_POOL_INVALID NULL
>> +
>> +/**
>> + * Clock sources for timers in timer pool.
>> + */
>> +typedef enum {
>> + /** Use CPU clock as clock source for timers */
>> + ODP_CLOCK_CPU,
>> + /** Use external clock as clock source for timers */
>> + ODP_CLOCK_EXT
>> + /* Platform dependent which other clock sources exist */
>> +} odp_timer_clk_src_t;
>> +
>> +/**
>> +* ODP timer handle (platform dependent).
>> +*/
>> typedef uint32_t odp_timer_t;
>>
>> -/** Invalid timer */
>> -#define ODP_TIMER_INVALID 0
>> +/**
>> +* ODP timeout handle (platform dependent).
>> +*/
>> +typedef void *odp_timeout_t;
>>
>> +/**
>> + * Invalid timer handle (platform dependent).
>> + */
>> +#define ODP_TIMER_INVALID ((uint32_t)~0U)
>>
>> /**
>> - * ODP timeout handle
>> + * Return values of timer set calls.
>> + */
>> +typedef enum {
>> +/**
>> + * Timer set operation succeeded
>> */
>> -typedef odp_buffer_t odp_timer_tmo_t;
>> + ODP_TIMER_SET_SUCCESS = 0,
>> +/**
>> + * Timer set operation failed, expiration too early.
>> + * Either retry with a later expiration time or process the timeout
>> + * immediately. */
>> + ODP_TIMER_SET_TOOEARLY = -1,
>>
>> -/** Invalid timeout */
>> -#define ODP_TIMER_TMO_INVALID 0
>> +/**
>> + * Timer set operation failed, expiration too late.
>> + * Truncate the expiration time against the maximum timeout for the
>> + * timer pool. */
>> + ODP_TIMER_SET_TOOLATE = -2,
>> +/**
>> + * Timer set operation failed because no timeout buffer specified of
>
> Typo? "or present"
OK
>
>> present
>> + * in timer (timer inactive/expired).
>> + */
>> + ODP_TIMER_SET_NOBUF = -3
>> +} odp_timer_set_t;
>>
>> +/** Maximum timer pool name length in chars (including null char) */
>> +#define ODP_TIMER_POOL_NAME_LEN 32
>>
>> -/**
>> - * Timeout notification
>> +/** Timer pool parameters
>> + * Timer pool parameters are used when creating and querying timer pools.
>> */
>> -typedef odp_buffer_t odp_timeout_t;
>> +typedef struct {
>> + uint64_t res_ns; /**< Timeout resolution in nanoseconds */
>> + uint64_t min_tmo; /**< Minimum relative timeout in nanoseconds */
>> + uint64_t max_tmo; /**< Maximum relative timeout in nanoseconds */
>> + uint32_t num_timers; /**< (Minimum) number of supported timers */
>> + int private; /**< Shared (false) or private (true) timer pool */
>> + odp_timer_clk_src_t clk_src; /**< Clock source for timers */
>> +} odp_timer_pool_param_t;
>>
>> +/**
>> + * Create a timer pool
>> + *
>> + * @param name Name of the timer pool. The string will be copied.
>> + * @param buf_pool Buffer pool for allocating timeouts
>> + * @param params Timer pool parameters. The content will be copied.
>> + *
>> + * @return Timer pool handle if successful, otherwise
>> ODP_TIMER_POOL_INVALID
>> + * and errno set
>
> This is the first API to use errno. Errno needs to be changed to odp_errno()
> (with odp_errno_clear(), odp_errno_print(), odp_errno_str()). That can be
> done after merge.
OK but these functions seem not to exist yet?
>
>
>> + */
>> +odp_timer_pool_t
>> +odp_timer_pool_create(const char *name,
>> + odp_buffer_pool_t buf_pool,
>> + const odp_timer_pool_param_t *params);
>>
>> /**
>> - * Create a timer
>> + * Start a timer pool
>> *
>> - * Creates a new timer with requested properties.
>> + * Start all created timer pools, enabling the allocation of timers.
>> + * The purpose of this call is to coordinate the creation of multiple
>> timer
>> + * pools that may use the same underlying HW resources.
>> + * This function may be called multiple times.
>> + */
>> +void odp_timer_pool_start(void);
>> +
>> +/**
>> + * Destroy a timer pool
>> *
>> - * @param name Name
>> - * @param pool Buffer pool for allocating timeout notifications
>> - * @param resolution Timeout resolution in nanoseconds
>> - * @param min_tmo Minimum timeout duration in nanoseconds
>> - * @param max_tmo Maximum timeout duration in nanoseconds
>> + * Destroy a timer pool, freeing all resources.
>> + * All timers must have been freed.
>> *
>> - * @return Timer handle if successful, otherwise ODP_TIMER_INVALID
>> + * @param tpid Timer pool identifier
>> */
>> -odp_timer_t odp_timer_create(const char *name, odp_buffer_pool_t pool,
>> - uint64_t resolution, uint64_t min_tmo,
>> - uint64_t max_tmo);
>> +void odp_timer_pool_destroy(odp_timer_pool_t tpid);
>>
>> /**
>> * Convert timer ticks to nanoseconds
>> *
>> - * @param timer Timer
>> + * @param tpid Timer pool identifier
>> * @param ticks Timer ticks
>> *
>> * @return Nanoseconds
>> */
>> -uint64_t odp_timer_tick_to_ns(odp_timer_t timer, uint64_t ticks);
>> +uint64_t odp_timer_tick_to_ns(odp_timer_pool_t tpid, uint64_t ticks);
>>
>> /**
>> * Convert nanoseconds to timer ticks
>> *
>> - * @param timer Timer
>> + * @param tpid Timer pool identifier
>> * @param ns Nanoseconds
>> *
>> * @return Timer ticks
>> */
>> -uint64_t odp_timer_ns_to_tick(odp_timer_t timer, uint64_t ns);
>> +uint64_t odp_timer_ns_to_tick(odp_timer_pool_t tpid, uint64_t ns);
>>
>> /**
>> - * Timer resolution in nanoseconds
>> + * Current tick value
>> *
>> - * @param timer Timer
>> + * @param tpid Timer pool identifier
>> *
>> - * @return Resolution in nanoseconds
>> + * @return Current time in timer ticks
>> + */
>> +uint64_t odp_timer_current_tick(odp_timer_pool_t tpid);
>> +
>> +/**
>> + * ODP timer pool information and configuration
>> */
>> -uint64_t odp_timer_resolution(odp_timer_t timer);
>> +
>> +typedef struct {
>> + odp_timer_pool_param_t param; /**< Parameters specified at creation
>> */
>> + uint32_t cur_timers; /**< Number of currently allocated timers */
>> + uint32_t hwm_timers; /**< High watermark of allocated timers */
>> + const char *name; /**< Name of timer pool */
>> +} odp_timer_pool_info_t;
>>
>> /**
>> - * Maximum timeout in timer ticks
>> + * Query timer pool configuration and current state
>> *
>> - * @param timer Timer
>> + * @param tpid Timer pool identifier
>> + * @param[out] info Pointer to information buffer
>> *
>> - * @return Maximum timeout in timer ticks
>> + * @retval 0 Success
>> + * @retval -1 Failure. Info could not be retrieved.
>> */
>> -uint64_t odp_timer_maximum_tmo(odp_timer_t timer);
>> +int odp_timer_pool_info(odp_timer_pool_t tpid,
>> + odp_timer_pool_info_t *info);
>>
>> /**
>> - * Current timer tick
>> + * Allocate a timer
>> *
>> - * @param timer Timer
>> + * Create a timer (allocating all necessary resources e.g. timeout event)
>> from
>> + * the timer pool. The user_ptr is copied to timeouts and can be
>> retrieved
>> + * using the odp_timer_userptr() call.
>
>
> ... odp_timeout_user_ptr() call.
OK
>
>
>> *
>> - * @return Current time in timer ticks
>> + * @param tpid Timer pool identifier
>> + * @param queue Destination queue for timeout notifications
>> + * @param user_ptr User defined pointer or NULL to be copied to timeouts
>> + *
>> + * @return Timer handle if successful, otherwise ODP_TIMER_INVALID and
>> + * errno set.
>> */
>> -uint64_t odp_timer_current_tick(odp_timer_t timer);
>> +odp_timer_t odp_timer_alloc(odp_timer_pool_t tpid,
>> + odp_queue_t queue,
>> + void *user_ptr);
>>
>> /**
>> - * Request timeout with an absolute timer tick
>> + * Free a timer
>> *
>> - * When tick reaches tmo_tick, the timer enqueues the timeout
>> notification into
>> - * the destination queue.
>> + * Free (destroy) a timer, reclaiming associated resources.
>> + * The timeout buffer for an active timer will be returned.
>> + * The timeout buffer for an expired timer will not be returned. It is
>> the
>> + * responsibility of the application to handle this timeout when it is
>> received.
>> *
>> - * @param timer Timer
>> - * @param tmo_tick Absolute timer tick value which triggers the timeout
>> - * @param queue Destination queue for the timeout notification
>> - * @param buf User defined timeout notification buffer. When
>> - * ODP_BUFFER_INVALID, default timeout notification is
>> used.
>> + * @param tim Timer handle
>> + * @return Buffer handle of timeout buffer or ODP_BUFFER_INVALID
>> + */
>> +odp_buffer_t odp_timer_free(odp_timer_t tim);
>> +
>> +/**
>> + * Set a timer (absolute time) with a user-provided timeout buffer
>> + *
>> + * Set (arm) the timer to expire at specific time. The timeout
>> + * buffer will be enqueued when the timer expires.
>> + *
>> + * Note: any invalid parameters will be treated as programming errors and
>> will
>> + * cause the application to abort.
>> + *
>> + * @param tim Timer
>> + * @param abs_tck Expiration time in absolute timer ticks
>> + * @param tmo_buf Reference to a buffer variable that points to timeout
>> buffer
>> + * or NULL to reuse the existing timeout buffer
>
> Tmo_buf parameter usage needs clarification:
> - Can this be always NULL, meaning that timer should be set with a tmo buffer
> allocated from the pool provided in timer_pool_create call?
No not in the current design. The idea could be investigated.
> - Is it also an output param? Timer_reset() writes it with old buffer handle
> value.
Yes. Should be fixed.
>
>
>> + *
>> + * @retval ODP_TIMER_SET_SUCCESS Operation succeeded
>> + * @retval ODP_TIMER_SET_TOOEARLY Operation failed because expiration
>> tick too
>> + * early
>> + * @retval ODP_TIMER_SET_TOOLATE Operation failed because expiration tick
>> too
>> + * late
>> + * @retval ODP_TIMER_SET_NOBUF Operation failed because timeout buffer
>> not
>> + * specified in call and not present in timer
>
> When this actually happens? When trying to reset an expired timer ?
Yes. Timer has already expired. The application can decide what to do.
Either allocate a new timeout buffer and retry the set operation or it
can ignore this situation because it knows the timeout buffer will be
received shortly. The application decides.
>
>> + */
>> +int odp_timer_set_abs(odp_timer_t tim,
>> + uint64_t abs_tck,
>> + odp_buffer_t *tmo_buf);
>> +
>> +/**
>> + * Set a timer with a relative expiration time and user-provided buffer.
>> + *
>> + * Set (arm) the timer to expire at a relative future time.
>> + *
>> + * Note: any invalid parameters will be treated as programming errors and
>> will
>> + * cause the application to abort.
>> + *
>> + * @param tim Timer
>> + * @param rel_tck Expiration time in timer ticks relative to current
>> time of
>> + * the timer pool the timer belongs to
>> + * @param tmo_buf Reference to a buffer variable that points to timeout
>> buffer
>> + * or NULL to reuse the existing timeout buffer
>> + *
>> + * @retval ODP_TIMER_SET_SUCCESS Operation succeeded
>> + * @retval ODP_TIMER_SET_TOOEARLY Operation failed because expiration
>> tick too
>> + * early
>> + * @retval ODP_TIMER_SET_TOOLATE Operation failed because expiration tick
>> too
>> + * late
>> + * @retval ODP_TIMER_SET_NOBUF Operation failed because timeout buffer
>> not
>> + * specified in call and not present in timer
>> + */
>> +int odp_timer_set_rel(odp_timer_t tim,
>> + uint64_t rel_tck,
>> + odp_buffer_t *tmo_buf);
>> +
>> +/**
>> + * Cancel a timer
>> *
>> - * @return Timeout handle if successful, otherwise ODP_TIMER_TMO_INVALID
>> + * Cancel a timer, preventing future expiration and delivery. Return any
>> + * present timeout buffer.
>> + *
>> + * A timer that has already expired may be impossible to cancel and the
>> timeout
>> + * will instead be delivered to the destination queue.
>> + *
>> + * Note: any invalid parameters will be treated as programming errors and
>> will
>> + * cause the application to abort.
>> + *
>> + * @param tim Timer
>> + * @param[out] tmo_buf Pointer to a buffer variable
>> + * @retval 0 Success, active timer cancelled, timeout returned in
>> '*tmo_buf'
>> + * @retval -1 Failure, timer already expired (or inactive)
>> */
>> -odp_timer_tmo_t odp_timer_absolute_tmo(odp_timer_t timer, uint64_t
>> tmo_tick,
>> - odp_queue_t queue, odp_buffer_t buf);
>> +int odp_timer_cancel(odp_timer_t tim, odp_buffer_t *tmo_buf);
>>
>> /**
>> - * Cancel a timeout
>> + * Return timeout handle that is associated with timeout buffer
>> + *
>> + * Note: any invalid parameters will cause undefined behavior and may
>> cause
>> + * the application to abort or crash.
>> *
>> - * @param timer Timer
>> - * @param tmo Timeout to cancel
>> + * @param buf A buffer of type ODP_BUFFER_TYPE_TIMEOUT
>> + *
>> + * @return timeout handle
>> + */
>> +odp_timeout_t odp_timeout_from_buf(odp_buffer_t buf);
>> +
>> +/**
>> + * Check for fresh timeout
>> + * If the corresponding timer has been reset or cancelled since this
>> timeout
>> + * was enqueued, the timeout is stale (not fresh).
>> *
>> - * @return 0 if successful
>> + * @param tmo Timeout handle
>> + * @retval 1 Timeout is fresh
>> + * @retval 0 Timeout is stale
>> */
>> -int odp_timer_cancel_tmo(odp_timer_t timer, odp_timer_tmo_t tmo);
>> +int /*odp_bool_t*/odp_timeout_fresh(odp_timeout_t tmo);
>
> Remove /*odp_bool_t*/
OK. Or use odp_bool_t instead of int? true -> fresh, false -> stale.
int as a return type if normally used with 0 for success and <>0 for failure.
>
>
> -Petri
>
>
>>
>> /**
>> - * Convert buffer handle to timeout handle
>> + * Return timer handle for the timeout
>> *
>> - * @param buf Buffer handle
>> + * Note: any invalid parameters will cause undefined behavior and may
>> cause
>> + * the application to abort or crash.
>> *
>> - * @return Timeout buffer handle
>> + * @param tmo Timeout handle
>> + *
>> + * @return Timer handle
>> */
>> -odp_timeout_t odp_timeout_from_buffer(odp_buffer_t buf);
>> +odp_timer_t odp_timeout_timer(odp_timeout_t tmo);
>>
>> /**
>> - * Return absolute timeout tick
>> + * Return expiration tick for the timeout
>> + *
>> + * Note: any invalid parameters will cause undefined behavior and may
>> cause
>> + * the application to abort or crash.
>> *
>> - * @param tmo Timeout buffer handle
>> + * @param tmo Timeout handle
>> *
>> - * @return Absolute timeout tick
>> + * @return Expiration tick
>> */
>> uint64_t odp_timeout_tick(odp_timeout_t tmo);
>>
>> /**
>> + * Return user pointer for the timeout
>> + * The user pointer was specified when the timer was allocated.
>> + *
>> + * Note: any invalid parameters will cause undefined behavior and may
>> cause
>> + * the application to abort or crash.
>> + *
>> + * @param tmo Timeout handle
>> + *
>> + * @return User pointer
>> + */
>> +void *odp_timeout_user_ptr(odp_timeout_t tmo);
>> +
>> +/**
>> * @}
>> */
>
>
>
>
>
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp