master
c 64 lines 1.34 KB
Raw
1 /*
2 * Thread Exerciser
3 *
4 * Unlike testthread which is mainly concerned about testing thread
5 * semantics this test is used to exercise the thread creation and
6 * accounting. A version of this test found a problem with clashing
7 * cpu_indexes which caused a break in plugin handling.
8 *
9 * Based on the original test case by Nikolay Igotti.
10 *
11 * Copyright (c) 2020 Linaro Ltd
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 */
15
16 #include <stdint.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <pthread.h>
21
22 int max_threads = 10;
23
24 typedef struct {
25 int delay;
26 } ThreadArg;
27
28 static void *thread_fn(void* varg)
29 {
30 ThreadArg *arg = varg;
31 usleep(arg->delay);
32 free(arg);
33 return NULL;
34 }
35
36 int main(int argc, char **argv)
37 {
38 int i;
39 pthread_t *threads;
40
41 if (argc > 1) {
42 max_threads = atoi(argv[1]);
43 }
44 threads = calloc(sizeof(pthread_t), max_threads);
45
46 for (i = 0; i < max_threads; i++) {
47 ThreadArg *arg = calloc(sizeof(ThreadArg), 1);
48 arg->delay = i * 100;
49 pthread_create(threads + i, NULL, thread_fn, arg);
50 }
51
52 printf("Created %d threads\n", max_threads);
53
54 /* sleep until roughly half the threads have "finished" */
55 usleep(max_threads * 50);
56
57 for (i = 0; i < max_threads; i++) {
58 pthread_join(threads[i], NULL);
59 }
60
61 printf("Done\n");
62
63 return 0;
64 }