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