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

Reply via email to