Maxim is this scheduled for 0.7 ? I think the tests from Yan,Barry,Mario require it
On 10 December 2014 at 08:29, Bill Fischofer <[email protected]> wrote: > > > On Wed, Dec 10, 2014 at 4:55 AM, Ola Liljedahl <[email protected]> > wrote: > >> Signed-off-by: Ola Liljedahl <[email protected]> >> > > Reviewed-by: Bill Fischofer <[email protected]> > > >> --- >> (This document/code contribution attached is provided under the terms of >> agreement LES-LTM-21309) >> Implemented the missing odp_ticketlock_trylock(). >> >> platform/linux-generic/odp_ticketlock.c | 30 >> ++++++++++++++++++++++++++++++ >> 1 file changed, 30 insertions(+) >> >> diff --git a/platform/linux-generic/odp_ticketlock.c >> b/platform/linux-generic/odp_ticketlock.c >> index 682b01b..6525786 100644 >> --- a/platform/linux-generic/odp_ticketlock.c >> +++ b/platform/linux-generic/odp_ticketlock.c >> @@ -34,6 +34,36 @@ void odp_ticketlock_lock(odp_ticketlock_t *ticketlock) >> odp_spin(); >> } >> >> +int odp_ticketlock_trylock(odp_ticketlock_t *tklock) >> +{ >> + /* We read 'next_ticket' and 'cur_ticket' non-atomically which >> should >> + * not be a problem as they are not independent of each other. >> + * 'cur_ticket' is always <= to 'next_ticket' and if we see an >> + * older value of 'cur_ticket', this only means the lock will >> + * look busy and trylock will fail. */ >> + uint32_t next = odp_atomic_load_u32(&tklock->next_ticket); >> + uint32_t cur = odp_atomic_load_u32(&tklock->cur_ticket); >> + /* First check that lock is available and possible to take without >> + * spinning. */ >> + if (next == cur) { >> + /* Then try to take the lock by incrementing 'next_ticket' >> + * but only if it still has the original value which is >> + * equal to 'cur_ticket'. >> + * We don't have to include 'cur_ticket' in the comparison >> + * because it cannot be larger than 'next_ticket' (only >> + * smaller if the lock is busy). >> + * If CAS fails, it means some other thread intercepted >> and >> + * took a ticket which means the lock is not available >> + * anymore */ >> + if >> (_odp_atomic_u32_cmp_xchg_strong_mm(&tklock->next_ticket, >> + &next, >> + next + 1, >> + _ODP_MEMMODEL_ACQ, >> + _ODP_MEMMODEL_RLX)) >> + return 1; >> + } >> + return 0; >> +} >> >> void odp_ticketlock_unlock(odp_ticketlock_t *ticketlock) >> { >> -- >> 1.9.1 >> >> >> _______________________________________________ >> lng-odp mailing list >> [email protected] >> http://lists.linaro.org/mailman/listinfo/lng-odp >> > > > _______________________________________________ > lng-odp mailing list > [email protected] > http://lists.linaro.org/mailman/listinfo/lng-odp > > -- *Mike Holmes* Linaro Sr Technical Manager LNG - ODP
_______________________________________________ lng-odp mailing list [email protected] http://lists.linaro.org/mailman/listinfo/lng-odp
