[lttng-dev] [PATCH 2/3] rculfhash: handle pthread_create failures
Eric Wong
normalperson at yhbt.net
Mon Jun 23 21:20:31 EDT 2014
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 <normalperson at yhbt.net>
---
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
More information about the lttng-dev
mailing list