Merged with minor style edits into master, stable-0.8 and stable-0.7,
thanks!

Mathieu

----- Original Message -----
> From: "Eric Wong" <[email protected]>
> To: [email protected]
> Cc: [email protected]
> Sent: Monday, June 23, 2014 9:20:31 PM
> Subject: [lttng-dev] [PATCH 2/3] rculfhash: handle pthread_create failures
> 
> Like calloc, pthread_create may fail with EAGAIN due to a lack
> of resources.  Account for that and gracefully continue.
> 
> Signed-off-by: Eric Wong <[email protected]>
> ---
>  rculfhash.c | 24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
> 
> diff --git a/rculfhash.c b/rculfhash.c
> index 2a45045..d534be2 100644
> --- a/rculfhash.c
> +++ b/rculfhash.c
> @@ -1171,6 +1171,7 @@ void partition_resize_helper(struct cds_lfht *ht,
> unsigned long i,
>               void (*fct)(struct cds_lfht *ht, unsigned long i,
>                       unsigned long start, unsigned long len))
>  {
> +     unsigned long start = 0;
>       unsigned long partition_len;
>       struct partition_resize_work *work;
>       int thread, ret;
> @@ -1201,6 +1202,18 @@ void partition_resize_helper(struct cds_lfht *ht,
> unsigned long i,
>               work[thread].fct = fct;
>               ret = pthread_create(&(work[thread].thread_id), ht->resize_attr,
>                       partition_resize_thread, &work[thread]);
> +             if (ret == EAGAIN) {
> +                     /*
> +                      * out of resources: wait and join the threads
> +                      * we've created, then handle leftovers
> +                      */
> +                     dbg_printf(
> +                           "error spawning for resize, single-threading\n");
> +                     start = work[thread].start;
> +                     len -= start;
> +                     nr_threads = thread;
> +                     break;
> +             }
>               assert(!ret);
>       }
>       for (thread = 0; thread < nr_threads; thread++) {
> @@ -1208,10 +1221,17 @@ void partition_resize_helper(struct cds_lfht *ht,
> unsigned long i,
>               assert(!ret);
>       }
>       free(work);
> -     return;
> +
> +     /*
> +      * a pthread_create failure above will either lead in us having
> +      * no threads to join or starting at a non-zero offset,
> +      * fallback to single thread processing of leftovers
> +      */
> +     if (start == 0 && nr_threads > 0)
> +             return;
>  fallback:
>       ht->flavor->thread_online();
> -     fct(ht, i, 0, len);
> +     fct(ht, i, start, len);
>       ht->flavor->thread_offline();
>  }
>  
> --
> 2.0.0.259.gbf1bc9c
> 
> 
> _______________________________________________
> lttng-dev mailing list
> [email protected]
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
> 

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com

_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to