Can we resolve any outstanding issues with this during today's ODP call?
This has been on the list for a while.

On Tue, Dec 8, 2015 at 1:53 AM, Savolainen, Petri (Nokia - FI/Espoo) <
[email protected]> wrote:

> ping.
>
> > -----Original Message-----
> > From: Savolainen, Petri (Nokia - FI/Espoo)
> > Sent: Thursday, November 26, 2015 10:56 AM
> > To: [email protected]
> > Subject: RE: [lng-odp] [API-NEXT PATCH v3] api: atomic: added
> > atomic_lock_free_u64
> >
> > ping.
> >
> > > -----Original Message-----
> > > From: lng-odp [mailto:[email protected]] On Behalf Of
> EXT
> > > Petri Savolainen
> > > Sent: Thursday, November 12, 2015 10:30 AM
> > > To: [email protected]
> > > Subject: [lng-odp] [API-NEXT PATCH v3] api: atomic: added
> > > atomic_lock_free_u64
> > >
> > > Platforms may support some uint64 operations lock-free and
> > > others not. For example, inc_64 can be natively supported but
> > > cas_64 (or max_64/min_64) not. User may be able to switch to
> > > 32 bit variables when a 64 bit operation uses locks. The same
> > > atomic operation struture could be used for platform init to guide
> > > lock vs. lock-free implementation (e.g. if cas_64 is never
> > > called, inc_64 can be lock-free).
> > >
> > > Signed-off-by: Petri Savolainen <[email protected]>
> > > ---
> > >  include/odp/api/atomic.h            | 48
> > > +++++++++++++++++++++++++++++++++++++
> > >  platform/linux-generic/Makefile.am  |  1 +
> > >  platform/linux-generic/odp_atomic.c | 24 +++++++++++++++++++
> > >  3 files changed, 73 insertions(+)
> > >  create mode 100644 platform/linux-generic/odp_atomic.c
> > >
> > > diff --git a/include/odp/api/atomic.h b/include/odp/api/atomic.h
> > > index 316f13a..5e897c1 100644
> > > --- a/include/odp/api/atomic.h
> > > +++ b/include/odp/api/atomic.h
> > > @@ -388,6 +388,54 @@ void odp_atomic_add_rls_u32(odp_atomic_u32_t
> *atom,
> > > uint32_t val);
> > >  void odp_atomic_sub_rls_u32(odp_atomic_u32_t *atom, uint32_t val);
> > >
> > >  /**
> > > + * Atomic operations
> > > + *
> > > + * Atomic operations listed in a bit field structure.
> > > + */
> > > +typedef union odp_atomic_op_t {
> > > +   /** Operation flags */
> > > +   struct {
> > > +           uint32_t init      : 1;  /**< Init atomic variable */
> > > +           uint32_t load      : 1;  /**< Atomic load */
> > > +           uint32_t store     : 1;  /**< Atomic store */
> > > +           uint32_t fetch_add : 1;  /**< Atomic fetch and add */
> > > +           uint32_t add       : 1;  /**< Atomic add */
> > > +           uint32_t fetch_sub : 1;  /**< Atomic fetch and substract */
> > > +           uint32_t sub       : 1;  /**< Atomic substract */
> > > +           uint32_t fetch_inc : 1;  /**< Atomic fetch and increment */
> > > +           uint32_t inc       : 1;  /**< Atomic increment */
> > > +           uint32_t fetch_dec : 1;  /**< Atomic fetch and decrement */
> > > +           uint32_t dec       : 1;  /**< Atomic decrement */
> > > +           uint32_t min       : 1;  /**< Atomic minimum */
> > > +           uint32_t max       : 1;  /**< Atomic maximum */
> > > +           uint32_t cas       : 1;  /**< Atomic compare and swap */
> > > +   } op;
> > > +
> > > +   /** All bits of the bit field structure.
> > > +     * Operation flag mapping is architecture specific. This field can
> > > be
> > > +     * used to set/clear all flags, or bitwise operations over the
> > > entire
> > > +     * structure. */
> > > +   uint32_t all_bits;
> > > +} odp_atomic_op_t;
> > > +
> > > +/**
> > > + * Query which atomic uint64 operations are lock-free
> > > + *
> > > + * Lock-free implementations have higher performance and scale better
> > > than
> > > + * implementations using locks. User can decide to use e.g. uint32
> > atomic
> > > + * variables instead of uint64 to optimize performance on platforms
> > that
> > > + * implement a performance critical operation using locks.
> > > + *
> > > + * @param atomic_op  Pointer to atomic operation structure for storing
> > > + *                   operation flags. All bits are initialized to zero
> > > during
> > > + *                   the operation. The parameter is ignored when
> NULL.
> > > + * @retval 0 None of the operations are lock-free
> > > + * @retval 1 Some of the operations are lock-free
> > > + * @retval 2 All operations are lock-free
> > > + */
> > > +int odp_atomic_lock_free_u64(odp_atomic_op_t *atomic_op);
> > > +
> > > +/**
> > >   * @}
> > >   */
> > >
> > > diff --git a/platform/linux-generic/Makefile.am b/platform/linux-
> > > generic/Makefile.am
> > > index a6b6029..0b7234e 100644
> > > --- a/platform/linux-generic/Makefile.am
> > > +++ b/platform/linux-generic/Makefile.am
> > > @@ -151,6 +151,7 @@ noinst_HEADERS = \
> > >               ${srcdir}/Makefile.inc
> > >
> > >  __LIB__libodp_la_SOURCES = \
> > > +                      odp_atomic.c \
> > >                        odp_barrier.c \
> > >                        odp_buffer.c \
> > >                        odp_classification.c \
> > > diff --git a/platform/linux-generic/odp_atomic.c b/platform/linux-
> > > generic/odp_atomic.c
> > > new file mode 100644
> > > index 0000000..996d09a
> > > --- /dev/null
> > > +++ b/platform/linux-generic/odp_atomic.c
> > > @@ -0,0 +1,24 @@
> > > +/* Copyright (c) 2015, Linaro Limited
> > > + * All rights reserved.
> > > + *
> > > + * SPDX-License-Identifier:     BSD-3-Clause
> > > + */
> > > +
> > > +#include <odp/atomic.h>
> > > +
> > > +int odp_atomic_lock_free_u64(odp_atomic_op_t *atomic_op)
> > > +{
> > > +#if __GCC_ATOMIC_LLONG_LOCK_FREE < 2
> > > +   /* All operations have locks */
> > > +   if (atomic_op)
> > > +           atomic_op->all_bits = 0;
> > > +
> > > +   return 0;
> > > +#else
> > > +   /* All operations are lock-free */
> > > +   if (atomic_op)
> > > +           atomic_op->all_bits = ~((uint32_t)0);
> > > +
> > > +   return 2;
> > > +#endif
> > > +}
> > > --
> > > 2.6.2
> > >
> > > _______________________________________________
> > > lng-odp mailing list
> > > [email protected]
> > > https://lists.linaro.org/mailman/listinfo/lng-odp
> _______________________________________________
> lng-odp mailing list
> [email protected]
> https://lists.linaro.org/mailman/listinfo/lng-odp
>
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to