On Wed, May 20, 2015 at 05:28:24PM +0200, Ola Liljedahl wrote:
> On 20 May 2015 at 16:16, Jerin Jacob <jerin.ja...@caviumnetworks.com> wrote:
> > On Wed, May 20, 2015 at 12:42:29PM +0200, Ola Liljedahl wrote:
> >> On 20 May 2015 at 06:56, Jerin Jacob <jerin.ja...@caviumnetworks.com> 
> >> wrote:
> >> > On Wed, May 20, 2015 at 12:25:12AM +0200, Ola Liljedahl wrote:
> >> >> On 19 May 2015 at 15:34, Jacob,  Jerin <jerin.ja...@caviumnetworks.com> 
> >> >> wrote:
> >> >> > Ola,
> >> >> >
> >> >> > Is there any specific reason for following check in timer validation 
> >> >> > test ?
> >> >> pa
> >> >> >
> >> >> > diff --git a/test/validation/odp_timer.c b/test/validation/odp_timer.c
> >> >> > index 554b353..724026e 100644
> >> >> > --- a/test/validation/odp_timer.c
> >> >> > +++ b/test/validation/odp_timer.c
> >> >> > @@ -260,7 +260,7 @@ static void handle_tmo(odp_event_t ev, bool 
> >> >> > stale, uint64_t prev_tick)
> >> >> >
> >> >> >         if (ttp != NULL) {
> >> >> >                 /* Internal error */
> >> >> > -               CU_ASSERT_FATAL(ttp->ev == ODP_EVENT_INVALID);
> >> >> > +---------->    CU_ASSERT_FATAL(ttp->ev == ODP_EVENT_INVALID);
> >> >> >                 ttp->ev = ev;
> >> >> >         }
> >> >> >  }
> >> >> >
> >> >> > AFAIU, I should be CU_ASSERT_FATAL(ttp->ev != ODP_EVENT_INVALID) as
> >> >> > tt[i].ev = odp_timeout_to_event(odp_timeout_alloc(tbp)) specified 
> >> >> > while preparing  all timers.
> >> >> Yes the timers are still inactive and the timeout event is stored in
> >> >> the 'ev' member.
> >> >>
> >> >> handle_timeout() is called for received timeouts (timer has expired).
> >> >> In that case, the corresponding 'ev' member should not contain any
> >> >> timeout event.
> >> >>
> >> >> >
> >> >> > Am I missing something in the timer specification ?
> >> >> Or the timer specification is missing something?
> >> >>
> >> >> odp_timer_set_abs(tt[i].tim, tck, &tt[i].ev); (line 309) is supposed
> >> >> to grab the timeout event (on success) and clear the variable (write
> >> >> ODP_TIMEOUT_INVALID), that's why the timeout is passed by reference
> >> >> ("&tt[i].ev").
> >> >>
> >> >> Possibly this is not specified clearly enough in timer.h:
> >> >>  * @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.
> >> >>
> >> >> The new timeout event is read from *tmo_ev. The old timeout event (if
> >> >> timer was active) or ODP_TIMEOUT_INVALID (if timer was inactive) is
> >> >> stored in *tmo_ev. I hope this is at least clear in the reference
> >> >> implementation.
> >> >
> >> > We are on same page, except the last notes
> >> > IMO, linux generic timer implementation details leaked into creating the 
> >> > test case.
> >> Well I don't agree and I hope I can convince you.
> >>
> >> >
> >> > AFAIU, *tmo_ev should have the event that used for _arming_ the timer so
> >> > that application can do some look up after receiving event through queue 
> >> > or something similar..
> >> > What is the point of providing "ODP_TIMEOUT_INVALID" to application 
> >> > back, What the
> >> > use of it for the application.
> >> It is possible to set an already active timer (which then is already
> >> associated with a timeout). If the user specifies a new timeout, the
> >> old timeout must be returned to the user (because all alloc and free
> >> of timeouts is the responsibility of the user). So any old timeout
> >> (for an already active timer) is return in "*tmo_ev". But it is
> >> possible that the timer has already expired (and the timeout been
> >> delivered) or wasn't active to start with. We want the application to
> >> be able to differ between these two scenarios and we achieve this by
> >> updating "*tmo_ev" accordingly. When the timer_set call return, if
> >> *tmo_ev != ODP_EVENT_INVALID, an timeout has been returned and the
> >> application needs to do something with it. If *tno_ev ==
> >> ODP_EVENT_INVALID, no timeout was returned.
> >
> >
> > Just to understand the usecase, What application is gonna do with returned 
> > *tmp_ev
> > if timer is active and it returned the associated timeout ?
> Either the application specified a new timeout in the timer_set call
> and it is that timeout which will be delivered upon timer expiration.
> If a timeout is returned (the old timeout for an already active
> timer), the application should free it or re-use it.
> 
> > it can't free as it will be cause double free when it comes back in
> > app mainloop(it will have odp_timeout_free() there).
> If a timeout is returned in *tmo_ev then it is not the same timeout.
> Old vs. new.
> 
> >
> > and application can't use the "returned associated timeout" for long time
> > what if it event is delivered and  free'ed it in the main loop.
> > Typical main loop application
> > processing will be check for event type, process it and free the resources
> >
> > Is this scheme is replacement for the API like odp_timer_active() to find 
> > the timer active or not ?
> >
> > I thought the reason for returning "*tmo_ev" in timer set operation
> > is that, if application is lazy(ie don't want to manage) to create the 
> > timeout event then
> > it can ask for the implementation with 'NULL' so that implementation
> > can get a odp timer event from the implementation and if application
> > want explicit control on any event(say packet event type) then it can set
> > through explicit event on timer set call :-)
> No, the application is always responsible for allocating and freeing
> timeouts. This is how it eventually became even if it wasn't so in
> earlier (never merged) proposals.

OK. I was thinking inline with "old" proposal where implementation creates the
event in case of "*tmo_ev" == ODP_TIMEOUT_INVALID and that created the 
complications
on responsibility of freeing the resources(app/implementation).Now is easy for 
the implementation :-)

Now its looks logical to me as when implementation gets "*tmo_ev" == 
ODP_TIMEOUT_INVALID
request then I can cancel the existing event delivery and re-arm the same event 
for future
time.



> 
> Appl calls odp_timer_set_abs() with a new timeout event in *tmo_ev. If
> the timer was already active (and thus associated with a timeout
> event), the old timeout is returned in *tmo_ev, otherwise
> ODP_TIMEOUT_INVALID is stored in *tmo_ev (so the value of *tmo_ev is
> always valid when the call returns). So *tmo_ev is both input (new
> timeout) and output (old timeout).
> 
> Appl can also call odp_timer_set_abs() with
> *tmo_ev=ODP_TIMEOUT_INVALID, resetting the timer with a new timeout
> time but reusing any existing timeout event. I expect this to be the
> normal usage, just kick the timer into the future for every sent or
> received packet. If the timer isn't active (and thus is not associated
> with any timeout event), the operation fails and the call returns
> ODP_TIMER_NOEVENT.
> 
> The timeout event can be of any type, not necessarily ODP_EVENT_TIMEOUT.
> 
> >
> >>
> >> I hope you can agree with this line of thinking.
> >>
> >> >
> >> > IMO, two way we can come to a conclusion for this issue.
> >> > 1) Remove CU_ASSERT_FATAL(ttp->ev == ODP_EVENT_INVALID) in handle_tmo 
> >> > function in unit testcase
> >> > 2) Or some reason, If application wants ODP_TIMEOUT_INVALID(for inactive 
> >> > case) in *tmo_ev
> >> > lets update the specification so that it will clear for odp implementer
> >> Yes the spec needs to be clearer.
> >>
> >> >
> >> > any thought from application perspective ?
> >> >
> >> >
> >> >>
> >> >> >
> >> >> > Thanks,
> >> >> > Jerin.
> >> >> >
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to