For pthreads, should the init function set flag->b = false? Acked-by: Ethan Jackson <et...@nicira.com>
On Mon, Dec 30, 2013 at 12:47 PM, Ben Pfaff <b...@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 <b...@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 <b...@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@openvswitch.org >> > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev