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

Reply via email to