On 12/18/2014 09:02 PM, Mike Holmes wrote:
Maxim is this scheduled for 0.7 ? I think the tests from Yan,Barry,Mario require it

If it's ready I think we don't need to wait and include it. Working on validation / merge...

Maxim.


On 10 December 2014 at 08:29, Bill Fischofer <[email protected] <mailto:[email protected]>> wrote:



    On Wed, Dec 10, 2014 at 4:55 AM, Ola Liljedahl
    <[email protected] <mailto:[email protected]>> wrote:

        Signed-off-by: Ola Liljedahl <[email protected]
        <mailto:[email protected]>>


    Reviewed-by: Bill Fischofer <[email protected]
    <mailto:[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] <mailto:[email protected]>
        http://lists.linaro.org/mailman/listinfo/lng-odp



    _______________________________________________
    lng-odp mailing list
    [email protected] <mailto:[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


_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to