Changes look fine by me. Kais.
On Tue, Aug 6, 2013 at 4:56 PM, Ben Pfaff <[email protected]> wrote: > Signed-off-by: Ben Pfaff <[email protected]> > --- > lib/ovs-thread.c | 33 ++++++++++++++++++++++++++++++++- > lib/ovs-thread.h | 17 +++++++++++++++++ > 2 files changed, 49 insertions(+), 1 deletion(-) > > diff --git a/lib/ovs-thread.c b/lib/ovs-thread.c > index d0ec9ec..055d66a 100644 > --- a/lib/ovs-thread.c > +++ b/lib/ovs-thread.c > @@ -169,18 +169,49 @@ ovs_mutex_cond_wait(pthread_cond_t *cond, const > struct ovs_mutex *mutex_) > ovs_abort(error, "pthread_cond_wait failed"); > } > } > + > +DEFINE_EXTERN_PER_THREAD_DATA(ovsthread_id, 0); > + > +struct ovsthread_aux { > + void *(*start)(void *); > + void *arg; > +}; > + > +static void * > +ovsthread_wrapper(void *aux_) > +{ > + static atomic_uint next_id = ATOMIC_VAR_INIT(1); > + > + struct ovsthread_aux *auxp = aux_; > + struct ovsthread_aux aux; > + unsigned int id; > + > + atomic_add(&next_id, 1, &id); > + *ovsthread_id_get() = id; > + > + aux = *auxp; > + free(auxp); > + > + return aux.start(aux.arg); > +} > > void > xpthread_create(pthread_t *threadp, pthread_attr_t *attr, > void *(*start)(void *), void *arg) > { > + struct ovsthread_aux *aux; > pthread_t thread; > int error; > > forbid_forking("multiple threads exist"); > multithreaded = true; > > - error = pthread_create(threadp ? threadp : &thread, attr, start, arg); > + aux = xmalloc(sizeof *aux); > + aux->start = start; > + aux->arg = arg; > + > + error = pthread_create(threadp ? threadp : &thread, attr, > + ovsthread_wrapper, aux); > if (error) { > ovs_abort(error, "pthread_create failed"); > } > diff --git a/lib/ovs-thread.h b/lib/ovs-thread.h > index abe479a..e644832 100644 > --- a/lib/ovs-thread.h > +++ b/lib/ovs-thread.h > @@ -501,6 +501,23 @@ ovsthread_once_start(struct ovsthread_once *once) > ((ONCE)->done ? false : ({ OVS_MACRO_LOCK((&ONCE->mutex)); true; })) > #endif > > +/* Thread ID. > + * > + * pthread_t isn't so nice for some purposes. Its size and > representation are > + * implementation dependent, which means that there is no way to hash it. > + * This thread ID avoids the problem. > + */ > + > +DECLARE_EXTERN_PER_THREAD_DATA(unsigned int, ovsthread_id); > + > +/* Returns a per-thread identifier unique within the lifetime of the > + * process. */ > +static inline unsigned int > +ovsthread_id_self(void) > +{ > + return *ovsthread_id_get(); > +} > + > void assert_single_threaded_at(const char *where); > #define assert_single_threaded() assert_single_threaded_at(SOURCE_LOCATOR) > > -- > 1.7.10.4 > > _______________________________________________ > dev mailing list > [email protected] > http://openvswitch.org/mailman/listinfo/dev >
_______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
