mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-07-23 03:05:48 +03:00
50 lines
1.8 KiB
Diff
50 lines
1.8 KiB
Diff
Patch-Source: https://github.com/oneapi-src/oneTBB/commit/137c1a88b690acf3525e0f279720ac489ce66481
|
|
From 137c1a88b690acf3525e0f279720ac489ce66481 Mon Sep 17 00:00:00 2001
|
|
From: Rui Ueyama <ruiu@cs.stanford.edu>
|
|
Date: Wed, 26 Oct 2022 04:54:20 -0700
|
|
Subject: [PATCH] Retry if pthread_create fails with EAGAIN (#824)
|
|
|
|
Signed-off-by: Rui Ueyama <ruiu@cs.stanford.edu>
|
|
---
|
|
src/tbb/rml_thread_monitor.h | 20 +++++++++++++++++++-
|
|
1 file changed, 19 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/tbb/rml_thread_monitor.h b/src/tbb/rml_thread_monitor.h
|
|
index 13b556380..57e9c30b0 100644
|
|
--- a/src/tbb/rml_thread_monitor.h
|
|
+++ b/src/tbb/rml_thread_monitor.h
|
|
@@ -31,6 +31,7 @@
|
|
#include <pthread.h>
|
|
#include <cstring>
|
|
#include <cstdlib>
|
|
+#include <time.h>
|
|
#else
|
|
#error Unsupported platform
|
|
#endif
|
|
@@ -191,8 +192,25 @@ inline thread_monitor::handle_type thread_monitor::launch( void* (*thread_routin
|
|
check(pthread_attr_init( &s ), "pthread_attr_init has failed");
|
|
if( stack_size>0 )
|
|
check(pthread_attr_setstacksize( &s, stack_size ), "pthread_attr_setstack_size has failed" );
|
|
+
|
|
+ // pthread_create(2) can spuriously fail with EAGAIN. We retry
|
|
+ // max_num_tries times with progressively longer wait times.
|
|
pthread_t handle;
|
|
- check( pthread_create( &handle, &s, thread_routine, arg ), "pthread_create has failed" );
|
|
+ const int max_num_tries = 20;
|
|
+ int error = EAGAIN;
|
|
+
|
|
+ for (int i = 0; i < max_num_tries && error == EAGAIN; i++) {
|
|
+ if (i != 0) {
|
|
+ // Wait i milliseconds
|
|
+ struct timespec ts = {0, i * 1000 * 1000};
|
|
+ nanosleep(&ts, NULL);
|
|
+ }
|
|
+ error = pthread_create(&handle, &s, thread_routine, arg);
|
|
+ }
|
|
+
|
|
+ if (error)
|
|
+ handle_perror(error, "pthread_create has failed");
|
|
+
|
|
check( pthread_attr_destroy( &s ), "pthread_attr_destroy has failed" );
|
|
return handle;
|
|
}
|