@@ -62,8 +62,8 @@ static const char *timerset2str(odp_timer_set_t val)
return "too early";
case ODP_TIMER_TOOLATE:
return "too late";
- case ODP_TIMER_NOBUF:
- return "no buffer";
+ case ODP_TIMER_NOEVENT:
+ return "no event";
default:
return "?";
}
@@ -72,7 +72,7 @@ static const char *timerset2str(odp_timer_set_t val)
/** @private Helper struct for timers */
struct test_timer {
odp_timer_t tim;
- odp_buffer_t buf;
+ odp_event_t ev;
};
/** @private Array of all timer helper structs */
@@ -86,6 +86,7 @@ static void test_abs_timeouts(int thr, test_args_t *args)
odp_queue_t queue;
uint64_t tick;
struct test_timer *ttp;
+ odp_buffer_t buf;
EXAMPLE_DBG(" [%i] test_timeouts\n", thr);
@@ -106,11 +107,12 @@ static void test_abs_timeouts(int thr, test_args_t *args)
EXAMPLE_ERR("Failed to allocate timer\n");
return;
}
- ttp->buf = odp_buffer_alloc(pool);
- if (ttp->buf == ODP_BUFFER_INVALID) {
+ buf = odp_buffer_alloc(pool);
+ if (buf == ODP_BUFFER_INVALID) {
EXAMPLE_ERR("Failed to allocate buffer\n");
return;
}
+ ttp->ev = odp_buffer_to_event(buf);
tick = odp_timer_current_tick(tp);
while ((int)odp_atomic_load_u32(&remain) > 0) {
@@ -118,7 +120,7 @@ static void test_abs_timeouts(int thr, test_args_t *args)
odp_timer_set_t rc;
tick += period;
- rc = odp_timer_set_abs(ttp->tim, tick, &ttp->buf);
+ rc = odp_timer_set_abs(ttp->tim, tick, &ttp->ev);
if (odp_unlikely(rc != ODP_TIMER_SUCCESS)) {
/* Too early or too late timeout requested */
EXAMPLE_ABORT("odp_timer_set_abs() failed: %s\n",
@@ -143,14 +145,14 @@ static void test_abs_timeouts(int thr, test_args_t *args)
if (ev == ODP_EVENT_INVALID)
break; /* No more timeouts */
if (odp_event_type(ev) != ODP_EVENT_TIMEOUT) {
- /* Not a default timeout buffer */
+ /* Not a default timeout event */
EXAMPLE_ABORT("Unexpected event type (%u) received\n",
odp_event_type(ev));
}
odp_timeout_t tmo = odp_timeout_from_event(ev);
tick = odp_timeout_tick(tmo);
ttp = odp_timeout_user_ptr(tmo);
- ttp->buf = odp_buffer_from_event(ev);
+ ttp->ev = ev;
if (!odp_timeout_fresh(tmo)) {
/* Not the expected expiration tick, timer has
* been reset or cancelled or freed */
@@ -163,12 +165,12 @@ static void test_abs_timeouts(int thr, test_args_t *args)
}
/* 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);
+ (void)odp_timer_cancel(ttp->tim, &ttp->ev);
+ if (ttp->ev != ODP_EVENT_INVALID)
+ odp_buffer_free(odp_buffer_from_event(ttp->ev));
else
- EXAMPLE_ERR("Lost timeout buffer at timer cancel\n");
- /* Since we have cancelled the timer, there is no timeout buffer to
+ EXAMPLE_ERR("Lost timeout event at timer cancel\n");
+ /* Since we have cancelled the timer, there is no timeout event to
* return from odp_timer_free() */
(void)odp_timer_free(ttp->tim);
}
@@ -20,7 +20,6 @@ extern "C" {
#include <stdlib.h>
#include <odp_std_types.h>
-#include <odp_buffer.h>
#include <odp_event.h>
#include <odp_queue.h>
@@ -86,10 +85,10 @@ typedef enum {
* timer pool. */
ODP_TIMER_TOOLATE = -2,
/**
- * Timer set operation failed because no timeout buffer specified and no
- * timeout buffer present in the timer (timer inactive/expired).
+ * Timer set operation failed because no timeout event specified and no
+ * timeout event present in the timer (timer inactive/expired).
*/
- ODP_TIMER_NOBUF = -3
+ ODP_TIMER_NOEVENT = -3
} odp_timer_set_t;
/** Maximum timer pool name length in chars (including null char) */
@@ -214,29 +213,29 @@ odp_timer_t odp_timer_alloc(odp_timer_pool_t tpid,
* Free a timer
*
* 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
+ * The timeout event for an active timer will be returned.
+ * The timeout event for an expired timer will not be returned. It is the
* responsibility of the application to handle this timeout when it is received.
*
* @param tim Timer handle
- * @return Buffer handle of timeout buffer or ODP_BUFFER_INVALID
+ * @return Event handle of timeout event or ODP_EVENT_INVALID
*/
-odp_buffer_t odp_timer_free(odp_timer_t tim);
+odp_event_t odp_timer_free(odp_timer_t tim);
/**
- * Set a timer (absolute time) with a user-provided timeout buffer
+ * Set a timer (absolute time) with a user-provided timeout event
*
* Set (arm) the timer to expire at specific time. The timeout
- * buffer will be enqueued when the timer expires.
+ * event 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[in,out] tmo_buf Reference to a buffer variable that points to
- * timeout buffer or NULL to reuse the existing timeout buffer. Any existing
- * timeout buffer that is replaced by a successful set operation will be
+ * @param[in,out] tmo_ev Reference to an event variable that points to
+ * timeout event or NULL to reuse the existing timeout event. Any existing
+ * timeout event that is replaced by a successful set operation will be
* returned here.
*
* @retval ODP_TIMER_SUCCESS Operation succeeded
@@ -244,15 +243,15 @@ odp_buffer_t odp_timer_free(odp_timer_t tim);
* early
* @retval ODP_TIMER_TOOLATE Operation failed because expiration tick too
* late
- * @retval ODP_TIMER_NOBUF Operation failed because timeout buffer not
+ * @retval ODP_TIMER_NOEVENT Operation failed because timeout event not
* specified in odp_timer_set call and not present in timer
*/
int odp_timer_set_abs(odp_timer_t tim,
uint64_t abs_tck,
- odp_buffer_t *tmo_buf);
+ odp_event_t *tmo_ev);
/**
- * Set a timer with a relative expiration time and user-provided buffer.
+ * Set a timer with a relative expiration time and user-provided event.
*
* Set (arm) the timer to expire at a relative future time.
*
@@ -262,9 +261,9 @@ int odp_timer_set_abs(odp_timer_t tim,
* @param tim Timer
* @param rel_tck Expiration time in timer ticks relative to current time of
* the timer pool the timer belongs to
- * @param[in,out] tmo_buf Reference to a buffer variable that points to
- * timeout buffer or NULL to reuse the existing timeout buffer. Any existing
- * timeout buffer that is replaced by a successful set operation will be
+ * @param[in,out] tmo_ev Reference to an event variable that points to
+ * timeout event or NULL to reuse the existing timeout event. Any existing
+ * timeout event that is replaced by a successful set operation will be
* returned here.
*
* @retval ODP_TIMER_SUCCESS Operation succeeded
@@ -272,18 +271,18 @@ int odp_timer_set_abs(odp_timer_t tim,
* early
* @retval ODP_TIMER_TOOLATE Operation failed because expiration tick too
* late
- * @retval ODP_TIMER_NOBUF Operation failed because timeout buffer not
+ * @retval ODP_TIMER_NOEVENT Operation failed because timeout event 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);
+ odp_event_t *tmo_ev);
/**
* Cancel a timer
*
* Cancel a timer, preventing future expiration and delivery. Return any
- * present timeout buffer.
+ * present timeout event.
*
* A timer that has already expired may be impossible to cancel and the timeout
* will instead be delivered to the destination queue.
@@ -292,23 +291,11 @@ int odp_timer_set_rel(odp_timer_t tim,
* 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'
+ * @param[out] tmo_ev Pointer to an event variable
+ * @retval 0 Success, active timer cancelled, timeout returned in '*tmo_ev'
* @retval -1 Failure, timer already expired (or inactive)
*/
-int odp_timer_cancel(odp_timer_t tim, odp_buffer_t *tmo_buf);
-
-/**
- * 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 buf A buffer of type ODP_BUFFER_TYPE_TIMEOUT
- *
- * @return timeout handle
- */
-odp_timeout_t odp_timeout_from_buf(odp_buffer_t buf);
+int odp_timer_cancel(odp_timer_t tim, odp_event_t *tmo_ev);
/**
* Return timeout handle that is associated with timeout event
@@ -316,7 +303,7 @@ odp_timeout_t odp_timeout_from_buf(odp_buffer_t buf);
* Note: any invalid parameters will cause undefined behavior and may cause
* the application to abort or crash.
*
- * @param buf An event of type ODP_EVENT_TIMEOUT
+ * @param ev An event of type ODP_EVENT_TIMEOUT
*
* @return timeout handle
*/
@@ -740,17 +740,17 @@ odp_timer_t odp_timer_alloc(odp_timer_pool_t tpid,
return ODP_TIMER_INVALID;
}
-odp_buffer_t odp_timer_free(odp_timer_t hdl)
+odp_event_t odp_timer_free(odp_timer_t hdl)
{
odp_timer_pool *tp = handle_to_tp(hdl);
uint32_t idx = handle_to_idx(hdl, tp);
odp_buffer_t old_buf = timer_free(tp, idx);
- return old_buf;
+ return odp_buffer_to_event(old_buf);
}
int odp_timer_set_abs(odp_timer_t hdl,
uint64_t abs_tck,
- odp_buffer_t *tmo_buf)
+ odp_event_t *tmo_ev)
{
odp_timer_pool *tp = handle_to_tp(hdl);
uint32_t idx = handle_to_idx(hdl, tp);
@@ -759,15 +759,15 @@ int odp_timer_set_abs(odp_timer_t hdl,
return ODP_TIMER_TOOEARLY;
if (odp_unlikely(abs_tck > cur_tick + tp->max_rel_tck))
return ODP_TIMER_TOOLATE;
- if (timer_reset(idx, abs_tck, tmo_buf, tp))
+ if (timer_reset(idx, abs_tck, (odp_buffer_t *)tmo_ev, tp))
return ODP_TIMER_SUCCESS;
else
- return ODP_TIMER_NOBUF;
+ return ODP_TIMER_NOEVENT;
}
int odp_timer_set_rel(odp_timer_t hdl,
uint64_t rel_tck,
- odp_buffer_t *tmo_buf)
+ odp_event_t *tmo_ev)
{
odp_timer_pool *tp = handle_to_tp(hdl);
uint32_t idx = handle_to_idx(hdl, tp);
@@ -776,34 +776,26 @@ int odp_timer_set_rel(odp_timer_t hdl,
return ODP_TIMER_TOOEARLY;
if (odp_unlikely(rel_tck > tp->max_rel_tck))
return ODP_TIMER_TOOLATE;
- if (timer_reset(idx, abs_tck, tmo_buf, tp))
+ if (timer_reset(idx, abs_tck, (odp_buffer_t *)tmo_ev, tp))
return ODP_TIMER_SUCCESS;
else
- return ODP_TIMER_NOBUF;
+ return ODP_TIMER_NOEVENT;
}
-int odp_timer_cancel(odp_timer_t hdl, odp_buffer_t *tmo_buf)
+int odp_timer_cancel(odp_timer_t hdl, odp_event_t *tmo_ev)
{
odp_timer_pool *tp = handle_to_tp(hdl);
uint32_t idx = handle_to_idx(hdl, tp);
/* Set the expiration tick of the timer to TMO_INACTIVE */
odp_buffer_t old_buf = timer_cancel(tp, idx, TMO_INACTIVE);
if (old_buf != ODP_BUFFER_INVALID) {
- *tmo_buf = old_buf;
+ *tmo_ev = odp_buffer_to_event(old_buf);
return 0; /* Active timer cancelled, timeout returned */
} else {
return -1; /* Timer already expired, no timeout returned */
}
}
-odp_timeout_t odp_timeout_from_buf(odp_buffer_t buf)
-{
- /* This check not mandated by the API specification */
- if (_odp_buffer_type(buf) != ODP_BUFFER_TYPE_TIMEOUT)
- ODP_ABORT("Buffer not a timeout");
- return (odp_timeout_t)timeout_hdr_from_buf(buf);
-}
-
odp_timeout_t odp_timeout_from_event(odp_event_t ev)
{
/* This check not mandated by the API specification */
@@ -37,25 +37,25 @@ static int min(int a, int b)
/* @private Timer helper structure */
struct test_timer {
odp_timer_t tim; /* Timer handle */
- odp_buffer_t buf; /* Timeout buffer */
- odp_buffer_t buf2; /* Copy of buffer handle */
+ odp_event_t ev; /* Timeout event */
+ odp_event_t ev2; /* Copy of event handle */
uint64_t tick; /* Expiration tick or TICK_INVALID */
};
#define TICK_INVALID (~(uint64_t)0)
-/* @private Handle a received (timeout) buffer */
-static void handle_tmo(odp_buffer_t buf, bool stale, uint64_t prev_tick)
+/* @private Handle a received (timeout) event */
+static void handle_tmo(odp_event_t ev, bool stale, uint64_t prev_tick)
{
/* Use assert() for internal correctness checks of test program */
- assert(buf != ODP_BUFFER_INVALID);
- if (odp_event_type(odp_buffer_to_event(buf)) != ODP_EVENT_TIMEOUT) {
- /* Not a timeout buffer */
- CU_FAIL("Unexpected buffer type received");
+ assert(ev != ODP_EVENT_INVALID);
+ if (odp_event_type(ev) != ODP_EVENT_TIMEOUT) {
+ /* Not a timeout event */
+ CU_FAIL("Unexpected event type received");
return;
}
/* Read the metadata from the timeout */
- odp_timeout_t tmo = odp_timeout_from_buf(buf);
+ odp_timeout_t tmo = odp_timeout_from_event(ev);
odp_timer_t tim = odp_timeout_timer(tmo);
uint64_t tick = odp_timeout_tick(tmo);
struct test_timer *ttp = odp_timeout_user_ptr(tmo);
@@ -65,7 +65,7 @@ static void handle_tmo(odp_buffer_t buf, bool stale, uint64_t prev_tick)
if (ttp == NULL)
CU_FAIL("odp_timeout_user_ptr() null user ptr");
- if (ttp->buf2 != buf)
+ if (ttp->ev2 != ev)
CU_FAIL("odp_timeout_user_ptr() wrong user ptr");
if (ttp->tim != tim)
CU_FAIL("odp_timeout_timer() wrong timer");
@@ -95,8 +95,8 @@ static void handle_tmo(odp_buffer_t buf, bool stale, uint64_t prev_tick)
}
/* Use assert() for correctness check of test program itself */
- assert(ttp->buf == ODP_BUFFER_INVALID);
- ttp->buf = buf;
+ assert(ttp->ev == ODP_EVENT_INVALID);
+ ttp->ev = ev;
}
/* @private Worker thread entrypoint which performs timer alloc/set/cancel/free
@@ -123,10 +123,12 @@ static void *worker_entrypoint(void *arg)
tt[i].tim = odp_timer_alloc(tp, queue, &tt[i]);
if (tt[i].tim == ODP_TIMER_INVALID)
CU_FAIL_FATAL("Failed to allocate timer");
- tt[i].buf = odp_buffer_alloc(tbp);
- if (tt[i].buf == ODP_BUFFER_INVALID)
+ /* Timeout alloc is needed.
+ * With this alloc call pool/event type should be buffer. */
+ tt[i].ev = odp_buffer_to_event(odp_buffer_alloc(tbp));
+ if (tt[i].ev == ODP_EVENT_INVALID)
CU_FAIL_FATAL("Failed to allocate timeout buffer");
- tt[i].buf2 = tt[i].buf;
+ tt[i].ev2 = tt[i].ev;
tt[i].tick = TICK_INVALID;
}
@@ -140,7 +142,7 @@ static void *worker_entrypoint(void *arg)
(rand_r(&seed) % RANGE_MS)
* 1000000ULL);
odp_timer_set_t rc;
- rc = odp_timer_set_abs(tt[i].tim, tck, &tt[i].buf);
+ rc = odp_timer_set_abs(tt[i].tim, tck, &tt[i].ev);
if (rc != ODP_TIMER_SUCCESS) {
CU_FAIL("Failed to set timer");
} else {
@@ -159,26 +161,24 @@ static void *worker_entrypoint(void *arg)
for (ms = 0; ms < 7 * RANGE_MS / 10; ms++) {
odp_event_t ev;
while ((ev = odp_queue_deq(queue)) != ODP_EVENT_INVALID) {
- odp_buffer_t buf;
- buf = odp_buffer_from_event(ev);
/* Subtract one from prev_tick to allow for timeouts
* to be delivered a tick late */
- handle_tmo(buf, false, prev_tick - 1);
+ handle_tmo(ev, false, prev_tick - 1);
nrcv++;
}
prev_tick = odp_timer_current_tick(tp);
i = rand_r(&seed) % NTIMERS;
- if (tt[i].buf == ODP_BUFFER_INVALID &&
+ if (tt[i].ev == ODP_EVENT_INVALID &&
(rand_r(&seed) % 2 == 0)) {
/* Timer active, cancel it */
- int rc = odp_timer_cancel(tt[i].tim, &tt[i].buf);
+ int rc = odp_timer_cancel(tt[i].tim, &tt[i].ev);
if (rc != 0)
/* Cancel failed, timer already expired */
ntoolate++;
tt[i].tick = TICK_INVALID;
ncancel++;
} else {
- if (tt[i].buf != ODP_BUFFER_INVALID)
+ if (tt[i].ev != ODP_EVENT_INVALID)
/* Timer inactive => set */
nset++;
else
@@ -193,7 +193,7 @@ static void *worker_entrypoint(void *arg)
do {
cur_tick = odp_timer_current_tick(tp);
rc = odp_timer_set_rel(tt[i].tim,
- tck, &tt[i].buf);
+ tck, &tt[i].ev);
} while (cur_tick != odp_timer_current_tick(tp));
if (rc == ODP_TIMER_TOOEARLY ||
rc == ODP_TIMER_TOOLATE) {
@@ -212,13 +212,13 @@ static void *worker_entrypoint(void *arg)
/* Cancel and free all timers */
uint32_t nstale = 0;
for (i = 0; i < NTIMERS; i++) {
- (void)odp_timer_cancel(tt[i].tim, &tt[i].buf);
+ (void)odp_timer_cancel(tt[i].tim, &tt[i].ev);
tt[i].tick = TICK_INVALID;
- if (tt[i].buf == ODP_BUFFER_INVALID)
+ if (tt[i].ev == ODP_EVENT_INVALID)
/* Cancel too late, timer already expired and
* timoeut buffer enqueued */
nstale++;
- if (odp_timer_free(tt[i].tim) != ODP_BUFFER_INVALID)
+ if (odp_timer_free(tt[i].tim) != ODP_EVENT_INVALID)
CU_FAIL("odp_timer_free");
}
@@ -237,8 +237,7 @@ static void *worker_entrypoint(void *arg)
while (nstale != 0) {
odp_event_t ev = odp_queue_deq(queue);
if (ev != ODP_EVENT_INVALID) {
- odp_buffer_t buf = odp_buffer_from_event(ev);
- handle_tmo(buf, true, 0/*Dont' care for stale tmo's*/);
+ handle_tmo(ev, true, 0/*Dont' care for stale tmo's*/);
nstale--;
} else {
CU_FAIL("Failed to receive stale timeout");
Changed timer API to use odp_event_t instead of odp_buffer_t. Signed-off-by: Petri Savolainen <petri.savolainen@linaro.org> --- example/timer/odp_timer_test.c | 28 ++++++------ platform/linux-generic/include/api/odp_timer.h | 63 ++++++++++---------------- platform/linux-generic/odp_timer.c | 28 ++++-------- test/validation/odp_timer.c | 55 +++++++++++----------- 4 files changed, 77 insertions(+), 97 deletions(-)