xref: /qemu/tests/tcg/multiarch/threadcount.c (revision abff1abf)
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 }
65