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
