[ovs-dev] [dpif-netdev 08/15] ovs-atomic: New functions atomic_flag_init(), atomic_flag_destroy().

Ethan Jackson ethan at nicira.com
Wed Jan 8 23:19:45 UTC 2014


For pthreads, should the init function set flag->b = false?

Acked-by: Ethan Jackson <ethan at nicira.com>


On Mon, Dec 30, 2013 at 12:47 PM, Ben Pfaff <blp at nicira.com> wrote:
> Oops.  I've folded this in:
>
> diff --git a/lib/ovs-atomic-gcc4+.h b/lib/ovs-atomic-gcc4+.h
> index 4476162..4938261 100644
> --- a/lib/ovs-atomic-gcc4+.h
> +++ b/lib/ovs-atomic-gcc4+.h
> @@ -238,6 +238,18 @@ typedef struct {
>  } atomic_flag;
>  #define ATOMIC_FLAG_INIT { false }
>
> +static inline void
> +atomic_flag_init(volatile atomic_flag *object OVS_UNUSED)
> +{
> +    /* Nothing to do. */
> +}
> +
> +static inline void
> +atomic_flag_destroy(volatile atomic_flag *object OVS_UNUSED)
> +{
> +    /* Nothing to do. */
> +}
> +
>  static inline bool
>  atomic_flag_test_and_set(volatile atomic_flag *object)
>  {
>
>
> On Mon, Dec 30, 2013 at 10:35:03AM -0800, Pravin Shelar wrote:
>> I am getting following linking error due to missing definition for
>> ovs-atomic-gcc4+.h
>>
>> lib/.libs/libopenvswitch.a(dpif-netdev.o): In function `dp_netdev_free':
>> /home/pravin/ovs/dpdk/openvswitch/lib/dpif-netdev.c:375: undefined
>> reference to `atomic_flag_destroy'
>> lib/.libs/libopenvswitch.a(dpif-netdev.o): In function `create_dp_netdev':
>> /home/pravin/ovs/dpdk/openvswitch/lib/dpif-netdev.c:290: undefined
>> reference to `atomic_flag_init'
>>
>>
>> On Fri, Dec 27, 2013 at 8:03 PM, Ben Pfaff <blp at nicira.com> wrote:
>> > Standard C11 doesn't need these functions because it is able to require
>> > implementations not to need them.  But we can't construct a portable
>> > implementation that does not need them in every case, so this commit adds
>> > them.
>> >
>> > These functions are only needed for atomic_flag objects that are
>> > dynamically allocated (because statically allocated objects can use
>> > ATOMIC_FLAG_INIT).  So far there aren't any of those, but an upcoming
>> > commit will introduce one.
>> >
>> > Signed-off-by: Ben Pfaff <blp at nicira.com>
>> > ---
>> >  lib/ovs-atomic-c11.h          |   12 ++++++++++++
>> >  lib/ovs-atomic-flag-gcc4.7+.h |   12 ++++++++++++
>> >  lib/ovs-atomic-pthreads.c     |   16 ++++++++++++++++
>> >  lib/ovs-atomic-pthreads.h     |    3 +++
>> >  lib/ovs-atomic.h              |   22 ++++++++++++++++++++++
>> >  5 files changed, 65 insertions(+)
>> >
>> > diff --git a/lib/ovs-atomic-c11.h b/lib/ovs-atomic-c11.h
>> > index 9dc687c..97262b2 100644
>> > --- a/lib/ovs-atomic-c11.h
>> > +++ b/lib/ovs-atomic-c11.h
>> > @@ -60,3 +60,15 @@ typedef _Atomic(int64_t)   atomic_int64_t;
>> >      (*(ORIG) = atomic_fetch_xor_explicit(RMW, ARG, ORDER), (void) 0)
>> >  #define atomic_and_explicit(RMW, ARG, ORIG, ORDER) \
>> >      (*(ORIG) = atomic_fetch_and_explicit(RMW, ARG, ORDER), (void) 0)
>> > +
>> > +static inline void
>> > +atomic_flag_init(volatile atomic_flag *object OVS_UNUSED)
>> > +{
>> > +    /* Nothing to do. */
>> > +}
>> > +
>> > +static inline void
>> > +atomic_flag_destroy(volatile atomic_flag *object OVS_UNUSED)
>> > +{
>> > +    /* Nothing to do. */
>> > +}
>> > diff --git a/lib/ovs-atomic-flag-gcc4.7+.h b/lib/ovs-atomic-flag-gcc4.7+.h
>> > index c42c7ca..385d0de 100644
>> > --- a/lib/ovs-atomic-flag-gcc4.7+.h
>> > +++ b/lib/ovs-atomic-flag-gcc4.7+.h
>> > @@ -26,6 +26,18 @@ typedef struct {
>> >  } atomic_flag;
>> >  #define ATOMIC_FLAG_INIT { .b = false }
>> >
>> > +static inline void
>> > +atomic_flag_init(volatile atomic_flag *object OVS_UNUSED)
>> > +{
>> > +    /* Nothing to do. */
>> > +}
>> > +
>> > +static inline void
>> > +atomic_flag_destroy(volatile atomic_flag *object OVS_UNUSED)
>> > +{
>> > +    /* Nothing to do. */
>> > +}
>> > +
>> >  static inline bool
>> >  atomic_flag_test_and_set_explicit(volatile atomic_flag *object,
>> >                                    memory_order order)
>> > diff --git a/lib/ovs-atomic-pthreads.c b/lib/ovs-atomic-pthreads.c
>> > index a501b82..4b3a337 100644
>> > --- a/lib/ovs-atomic-pthreads.c
>> > +++ b/lib/ovs-atomic-pthreads.c
>> > @@ -20,6 +20,22 @@
>> >  #include "ovs-thread.h"
>> >
>> >  #if OVS_ATOMIC_PTHREADS_IMPL
>> > +void
>> > +atomic_flag_init(volatile atomic_flag *flag_)
>> > +{
>> > +    atomic_flag *flag = CONST_CAST(atomic_flag *, flag_);
>> > +
>> > +    pthread_mutex_init(&flag->mutex, NULL);
>> > +}
>> > +
>> > +void
>> > +atomic_flag_destroy(volatile atomic_flag *flag_)
>> > +{
>> > +    atomic_flag *flag = CONST_CAST(atomic_flag *, flag_);
>> > +
>> > +    pthread_mutex_destroy(&flag->mutex);
>> > +}
>> > +
>> >  bool
>> >  atomic_flag_test_and_set(volatile atomic_flag *flag_)
>> >  {
>> > diff --git a/lib/ovs-atomic-pthreads.h b/lib/ovs-atomic-pthreads.h
>> > index 2f47a9c..840c7a6 100644
>> > --- a/lib/ovs-atomic-pthreads.h
>> > +++ b/lib/ovs-atomic-pthreads.h
>> > @@ -148,6 +148,9 @@ typedef struct {
>> >  } atomic_flag;
>> >  #define ATOMIC_FLAG_INIT { false, PTHREAD_MUTEX_INITIALIZER }
>> >
>> > +void atomic_flag_init(volatile atomic_flag *);
>> > +void atomic_flag_destroy(volatile atomic_flag *);
>> > +
>> >  bool atomic_flag_test_and_set(volatile atomic_flag *);
>> >  bool atomic_flag_test_and_set_explicit(volatile atomic_flag *, memory_order);
>> >
>> > diff --git a/lib/ovs-atomic.h b/lib/ovs-atomic.h
>> > index a9ae4ae..e714114 100644
>> > --- a/lib/ovs-atomic.h
>> > +++ b/lib/ovs-atomic.h
>> > @@ -204,9 +204,31 @@
>> >   * atomic_flag is a typedef for a type with two states, set and clear, that
>> >   * provides atomic test-and-set functionality.
>> >   *
>> > + *
>> > + * Life Cycle
>> > + * ----------
>> > + *
>> >   * ATOMIC_FLAG_INIT is an initializer for atomic_flag.  The initial state is
>> >   * "clear".
>> >   *
>> > + * C11 does not have an initialization or destruction function for atomic_flag,
>> > + * because implementations should not need one (one may simply
>> > + * atomic_flag_clear() an uninitialized atomic_flag), but some implementations
>> > + * of the OVS atomics do need them.  Thus, the following two functions are
>> > + * provided for initializing and destroying non-static atomic_flags:
>> > + *
>> > + *     void atomic_flag_init(volatile atomic_flag *object);
>> > + *
>> > + *         Initializes 'object'.  The initial state is "clear".
>> > + *
>> > + *     void atomic_flag_destroy(volatile atomic_flag *object);
>> > + *
>> > + *         Destroys 'object'.
>> > + *
>> > + *
>> > + * Operations
>> > + * ----------
>> > + *
>> >   * The following functions are available.
>> >   *
>> >   *     bool atomic_flag_test_and_set(atomic_flag *object)
>> > --
>> > 1.7.10.4
>> >
>> > _______________________________________________
>> > dev mailing list
>> > dev at openvswitch.org
>> > http://openvswitch.org/mailman/listinfo/dev
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list