// SPDX-License-Identifier: GPL-2.0 #include #include #include #include #include #include #include #include "../tests.h" #define MAX_THREADS 25 static int iterations = 500; int named_threads_work = 1234; typedef void *(*thread_fn_t)(void *); #define DEFINE_THREAD(n) \ noinline void *named_threads_thread##n(void *arg __maybe_unused) \ { \ pthread_setname_np(pthread_self(), "thread" #n); \ for (int i = 0; i < iterations; i++) \ named_threads_work += 3; \ \ return NULL; \ } #define THREAD_LIST(macro) \ macro(1) \ macro(2) \ macro(3) \ macro(4) \ macro(5) \ macro(6) \ macro(7) \ macro(8) \ macro(9) \ macro(10) \ macro(11) \ macro(12) \ macro(13) \ macro(14) \ macro(15) \ macro(16) \ macro(17) \ macro(18) \ macro(19) \ macro(20) \ macro(21) \ macro(22) \ macro(23) \ macro(24) \ macro(25) #define DECLARE_THREAD(n) void *named_threads_thread##n(void *arg); THREAD_LIST(DECLARE_THREAD) THREAD_LIST(DEFINE_THREAD) #define THREAD_ENTRY(n) named_threads_thread##n, static thread_fn_t thread_fns[MAX_THREADS] = { THREAD_LIST(THREAD_ENTRY) }; /* * Creates argv[0] threads that run a unique function named "thread[x]" which performs * a multiplication in a loop for argv[1] loops. */ static int named_threads(int argc, const char **argv) { pthread_t threads[MAX_THREADS]; int nr_threads = 1; int err = 0; if (argc > 0) nr_threads = atoi(argv[0]); if (nr_threads <= 0 || nr_threads > MAX_THREADS) { fprintf(stderr, "Error: num threads must be 1 - %d\n", MAX_THREADS); return 1; } if (argc > 1) iterations = atoi(argv[1]); if (iterations < 0) { fprintf(stderr, "Error: iterations must be non-negative\n"); return 1; } for (int i = 0; i < nr_threads; i++) { int ret; ret = pthread_create(&threads[i], NULL, thread_fns[i], NULL); if (ret) { fprintf(stderr, "Error: failed to create thread%d: %s\n", i + 1, strerror(ret)); return 1; } } for (int i = 0; i < nr_threads; i++) pthread_join(threads[i], NULL); return err; } DEFINE_WORKLOAD(named_threads);