On 2 September 2014 03:34, Anders Roxell <[email protected]> wrote:
> On 2014-08-28 17:15, Petri Savolainen wrote: > > Use resolution and min/max tmo values from timer create call. > > > > Signed-off-by: Petri Savolainen <[email protected]> > > --- > > platform/linux-generic/odp_timer.c | 68 > ++++++++++++++++++++++++++++---------- > > 1 file changed, 51 insertions(+), 17 deletions(-) > > > > diff --git a/platform/linux-generic/odp_timer.c > b/platform/linux-generic/odp_timer.c > > index 1bf37f9..07b1029 100644 > > --- a/platform/linux-generic/odp_timer.c > > +++ b/platform/linux-generic/odp_timer.c > > @@ -18,9 +18,16 @@ > > > > #include <string.h> > > > > + > > +/* Nanoseconds */ > > +#define USEC 1000UL > > +#define MSEC 1000000UL > > +#define SEC 1000000000UL > > Should this be moved to a common odp_header file? > This is defined in example/timer/odp_timer_test.c as well... > This got introduced in commit c51c0cbbdaa0f4668c966a9f50c7866d6ac489ce > The ones in odp_timer_test.c are generating doxygen warnings. https://ci.linaro.org/view/odp-ci/job/odp-api-doxygen-generation/379/warnings12Result/NORMAL/ > > Cheers, > Anders > > > + > > #define NUM_TIMERS 1 > > #define MAX_TICKS 1024 > > -#define RESOLUTION_NS 1000000 > > +#define MAX_RES SEC > > +#define MIN_RES (100*USEC) > > > > > > typedef struct { > > @@ -112,13 +119,13 @@ static int find_and_del_tmo(timeout_t **tmo, > odp_timer_tmo_t handle) > > int odp_timer_cancel_tmo(odp_timer_t timer_hdl, odp_timer_tmo_t tmo) > > { > > int id; > > - uint64_t tick_idx; > > + int tick_idx; > > timeout_t *cancel_tmo; > > odp_timeout_hdr_t *tmo_hdr; > > tick_t *tick; > > > > /* get id */ > > - id = timer_hdl - 1; > > + id = (int)timer_hdl - 1; > > > > tmo_hdr = odp_timeout_hdr((odp_timeout_t) tmo); > > /* get tmo_buf to cancel */ > > @@ -179,6 +186,7 @@ static void timer_start(timer_ring_t *timer) > > { > > struct sigevent sigev; > > struct itimerspec ispec; > > + uint64_t res, sec, nsec; > > > > ODP_DBG("\nTimer (%u) starts\n", timer->timer_hdl); > > > > @@ -194,10 +202,14 @@ static void timer_start(timer_ring_t *timer) > > return; > > } > > > > - ispec.it_interval.tv_sec = 0; > > - ispec.it_interval.tv_nsec = RESOLUTION_NS; > > - ispec.it_value.tv_sec = 0; > > - ispec.it_value.tv_nsec = RESOLUTION_NS; > > + res = timer->resolution_ns; > > + sec = res / SEC; > > + nsec = res - sec*SEC; > > + > > + ispec.it_interval.tv_sec = (time_t)sec; > > + ispec.it_interval.tv_nsec = (long)nsec; > > + ispec.it_value.tv_sec = (time_t)sec; > > + ispec.it_value.tv_nsec = (long)nsec; > > > > if (timer_settime(timer->timerid, 0, &ispec, NULL)) { > > ODP_DBG("Timer set failed\n"); > > @@ -250,19 +262,41 @@ int odp_timer_disarm_all(void) > > } > > > > 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) > > + uint64_t resolution_ns, uint64_t min_ns, > > + uint64_t max_ns) > > { > > uint32_t id; > > timer_ring_t *timer; > > odp_timer_t timer_hdl; > > int i; > > - (void) name; (void) resolution; (void) min_tmo; (void) max_tmo; > > + uint64_t max_ticks; > > + (void) name; > > + > > + if (resolution_ns < MIN_RES) > > + resolution_ns = MIN_RES; > > + > > + if (resolution_ns > MAX_RES) > > + resolution_ns = MAX_RES; > > + > > + max_ticks = max_ns / resolution_ns; > > + > > + if (max_ticks > MAX_TICKS) { > > + ODP_DBG("Maximum timeout too long: %"PRIu64" ticks\n", > > + max_ticks); > > + return ODP_TIMER_INVALID; > > + } > > + > > + if (min_ns < resolution_ns) { > > + ODP_DBG("Min timeout %"PRIu64" ns < resolution %"PRIu64" > ns\n", > > + min_ns, resolution_ns); > > + return ODP_TIMER_INVALID; > > + } > > > > odp_spinlock_lock(&odp_timer.lock); > > > > if (odp_timer.num_timers >= NUM_TIMERS) { > > odp_spinlock_unlock(&odp_timer.lock); > > + ODP_DBG("All timers allocated\n"); > > return ODP_TIMER_INVALID; > > } > > > > @@ -281,7 +315,7 @@ odp_timer_t odp_timer_create(const char *name, > odp_buffer_pool_t pool, > > > > timer->timer_hdl = timer_hdl; > > timer->pool = pool; > > - timer->resolution_ns = RESOLUTION_NS; > > + timer->resolution_ns = resolution_ns; > > timer->max_ticks = MAX_TICKS; > > > > for (i = 0; i < MAX_TICKS; i++) { > > @@ -308,7 +342,7 @@ odp_timer_tmo_t odp_timer_absolute_tmo(odp_timer_t > timer_hdl, uint64_t tmo_tick, > > odp_timeout_hdr_t *tmo_hdr; > > timer_ring_t *timer; > > > > - id = timer_hdl - 1; > > + id = (int)timer_hdl - 1; > > timer = &odp_timer.timer[id]; > > > > cur_tick = timer->cur_tick; > > @@ -317,17 +351,17 @@ odp_timer_tmo_t odp_timer_absolute_tmo(odp_timer_t > timer_hdl, uint64_t tmo_tick, > > return ODP_TIMER_TMO_INVALID; > > } > > > > - tick = tmo_tick - cur_tick; > > - if (tick > MAX_TICKS) { > > - ODP_DBG("timeout too far\n"); > > + if ((tmo_tick - cur_tick) > MAX_TICKS) { > > + ODP_DBG("timeout too far: cur %"PRIu64" tmo %"PRIu64"\n", > > + cur_tick, tmo_tick); > > return ODP_TIMER_TMO_INVALID; > > } > > > > - tick = (cur_tick + tick) % MAX_TICKS; > > + tick = tmo_tick % MAX_TICKS; > > > > tmo_buf = odp_buffer_alloc(timer->pool); > > if (tmo_buf == ODP_BUFFER_INVALID) { > > - ODP_DBG("alloc failed\n"); > > + ODP_DBG("tmo buffer alloc failed\n"); > > return ODP_TIMER_TMO_INVALID; > > } > > > > -- > > 2.1.0 > > > > > > _______________________________________________ > > lng-odp mailing list > > [email protected] > > http://lists.linaro.org/mailman/listinfo/lng-odp > > -- > Anders Roxell > [email protected] > M: +46 709 71 42 85 | IRC: roxell > > _______________________________________________ > lng-odp mailing list > [email protected] > http://lists.linaro.org/mailman/listinfo/lng-odp > -- *Mike Holmes* Linaro Technical Manager / Lead LNG - ODP
_______________________________________________ lng-odp mailing list [email protected] http://lists.linaro.org/mailman/listinfo/lng-odp
