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

Reply via email to