]> git.saurik.com Git - apple/xnu.git/blame - tools/tests/unit_tests/test_waitqlocktry_12053360.c
xnu-2422.1.72.tar.gz
[apple/xnu.git] / tools / tests / unit_tests / test_waitqlocktry_12053360.c
CommitLineData
39236c6e
A
1/*
2 * File: test_waitqlocktry_12053360.c
3 * Test Description: This is a load test for wait queues in the kernel. It is designed to excercise the locking of threads and
4 * wait queues in the face of timer expirations. The overall runtime is limited to 90 secs.
5 * In case of inconsistency we have found to be panic'ing within the first 15 secs.
6 * Radar: <rdar://problem/12053360> <rdar://problem/12323652>
7 */
8
9#include <unistd.h>
10#include <stdio.h>
11#include <mach/semaphore.h>
12#include <time.h>
13#include <stdlib.h>
14#include <pthread.h>
15
16#define MAX_TEST_RUN_TIME 90
17uint32_t test_usleep_max;
18
19void*
20test_thread(void *arg __unused)
21{
22 while (1) {
23 usleep(random() % test_usleep_max);
24 }
25
26 return NULL;
27}
28
29
30int
31main(int argc, const char **argv)
32{
33 pthread_t *threads;
34 uint32_t nthreads, i;
35 int tmp, result;
36
37 if (argc != 3) {
38 printf("Usage: %s <max sleep in usecs> <nthreads>\n", argv[0]);
39 printf("Currently defaulting to 100us and 100 threads\n");
40 test_usleep_max = 100;
41 nthreads = 100;
42 }else {
43
44 tmp = atoi(argv[1]);
45 if (tmp < 0) {
46 printf("Sleep time must be > 0.\n");
47 exit(1);
48 }
49
50 test_usleep_max = (uint32_t)tmp;
51
52 tmp = atoi(argv[2]);
53 if (tmp < 0) {
54 printf("Num threads must be > 0.\n");
55 exit(1);
56 }
57 nthreads = (uint32_t)tmp;
58 }
59 threads = (pthread_t*)malloc(nthreads * sizeof(pthread_t));
60 if (threads == NULL) {
61 printf("Failed to allocate thread array.\n");
62 exit(1);
63 }
64
65 printf("Creating %u threads with a max sleep time of %uusec.\n", nthreads, test_usleep_max);
66 srand(time(NULL));
67 for (i = 0; i < nthreads; i++) {
68 result = pthread_create(&threads[i], NULL, test_thread, NULL);
69 if (result != 0) {
70 printf("Failed to allocate thread.\n");
71 exit(1);
72 }
73 }
74
75 printf("Main thread sleeping for %d secs\n", MAX_TEST_RUN_TIME);
76 sleep(MAX_TEST_RUN_TIME);
77 printf("Success. Exiting..\n");
78 return 0;
79}