diff options
| author | root <root@alpha.trunkmasters.com> | 2026-06-12 19:09:37 -0500 |
|---|---|---|
| committer | root <root@alpha.trunkmasters.com> | 2026-06-12 19:09:37 -0500 |
| commit | b590c8d7572b727d565cc0b8ff660d43569845de (patch) | |
| tree | 06f7a4102ea4e845df8b66660f252920d52952f9 /dev-cpp/tbb/files/tbb-2021.7.0-pthread-eagain.patch | |
| parent | 24f9cbfc4c34fdb6a6e03311674414e881ceab47 (diff) | |
| download | srcux-b590c8d7572b727d565cc0b8ff660d43569845de.tar.gz srcux-b590c8d7572b727d565cc0b8ff660d43569845de.tar.xz srcux-b590c8d7572b727d565cc0b8ff660d43569845de.zip | |
Adding metadata
Diffstat (limited to 'dev-cpp/tbb/files/tbb-2021.7.0-pthread-eagain.patch')
| -rw-r--r-- | dev-cpp/tbb/files/tbb-2021.7.0-pthread-eagain.patch | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/dev-cpp/tbb/files/tbb-2021.7.0-pthread-eagain.patch b/dev-cpp/tbb/files/tbb-2021.7.0-pthread-eagain.patch new file mode 100644 index 000000000000..6c0912ec96b7 --- /dev/null +++ b/dev-cpp/tbb/files/tbb-2021.7.0-pthread-eagain.patch @@ -0,0 +1,135 @@ +https://bugs.gentoo.org/881161 +https://github.com/rui314/mold/issues/410 +https://github.com/oneapi-src/oneTBB/commit/ceacd2207edfb72a8fc235213265afe68ce74ad0 +https://github.com/oneapi-src/oneTBB/commit/137c1a88b690acf3525e0f279720ac489ce66481 + +From ceacd2207edfb72a8fc235213265afe68ce74ad0 Mon Sep 17 00:00:00 2001 +From: Ilya Isaev <ilya.isaev@intel.com> +Date: Wed, 26 Oct 2022 13:13:51 +0200 +Subject: [PATCH] Rework test_eh_thread to avoid sporadic failures (#946) + +Signed-off-by: Isaev, Ilya <ilya.isaev@intel.com> +--- a/test/tbb/test_eh_thread.cpp ++++ b/test/tbb/test_eh_thread.cpp +@@ -54,15 +54,16 @@ void limitThreads(size_t limit) + CHECK_MESSAGE(0 == ret, "setrlimit has returned an error"); + } + +-static bool g_exception_caught = false; +-static std::mutex m; +-static std::condition_variable cv; +-static std::atomic<bool> stop{ false }; ++size_t getThreadLimit() { ++ rlimit rlim; ++ ++ int ret = getrlimit(RLIMIT_NPROC, &rlim); ++ CHECK_MESSAGE(0 == ret, "getrlimit has returned an error"); ++ return rlim.rlim_cur; ++} + + static void* thread_routine(void*) + { +- std::unique_lock<std::mutex> lock(m); +- cv.wait(lock, [] { return stop == true; }); + return nullptr; + } + +@@ -94,32 +95,17 @@ TEST_CASE("Too many threads") { + } + + // Some systems set really big limit (e.g. >45К) for the number of processes/threads +- limitThreads(1024); +- +- std::thread /* isolate test */ ([] { +- std::vector<Thread> threads; +- stop = false; +- auto finalize = [&] { +- stop = true; +- cv.notify_all(); +- for (auto& t : threads) { +- t.join(); +- } +- }; +- +- for (int i = 0;; ++i) { ++ limitThreads(1); ++ if (getThreadLimit() == 1) { ++ for (int attempt = 0; attempt < 5; ++attempt) { + Thread thread; +- if (!thread.isValid()) { +- break; +- } +- threads.push_back(thread); +- if (i == 1024) { +- WARN_MESSAGE(false, "setrlimit seems having no effect"); +- finalize(); ++ if (thread.isValid()) { ++ WARN_MESSAGE(false, "We were able to create a thread. setrlimit seems having no effect"); ++ thread.join(); + return; + } + } +- g_exception_caught = false; ++ bool g_exception_caught = false; + try { + // Initialize the library to create worker threads + tbb::parallel_for(0, 2, [](int) {}); +@@ -132,9 +118,10 @@ TEST_CASE("Too many threads") { + } + // Do not CHECK to avoid memory allocation (we can be out of memory) + if (!g_exception_caught) { +- FAIL("No exception was caught"); ++ FAIL("No exception was thrown on library initialization"); + } +- finalize(); +- }).join(); ++ } else { ++ WARN_MESSAGE(false, "setrlimit seems having no effect"); ++ } + } + #endif + +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> +--- 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; + } + |
