1// Copyright 2016 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <stdio.h>
6#include <threads.h>
7
8#include <zircon/syscalls.h>
9#include <zircon/time.h>
10#include <zircon/types.h>
11
12#define NUM_THREADS 1000
13
14static int thread_func(void* arg) {
15  return 0;
16}
17
18static void thread_create(thrd_t* thread) {
19  int ret = thrd_create_with_name(thread, thread_func, NULL, "stress");
20  if (ret != thrd_success) {
21    printf("Failed to create thread: %d", ret);
22  }
23}
24
25static void thread_join(thrd_t thread) {
26  int ret = thrd_join(thread, NULL);
27  if (ret != thrd_success) {
28    printf("Failed to join thread: %d", ret);
29  }
30}
31
32int main(int argc, char** argv) {
33    printf("Running thread stress test...\n");
34    thrd_t thread[NUM_THREADS];
35    while (true) {
36        zx_time_t start = zx_clock_get_monotonic();
37        for (int i = 0; i != NUM_THREADS; ++i) {
38            thread_create(&thread[i]);
39        }
40        zx_time_t create = zx_clock_get_monotonic();
41        for (int i = 0; i != NUM_THREADS; ++i) {
42            thread_join(thread[i]);
43        }
44        zx_time_t join = zx_clock_get_monotonic();
45        printf(
46            "%d threads in %.2fs (create %.2fs, join %.2fs)\n",
47            NUM_THREADS,
48            zx_time_sub_time(join, start) / 1e9,
49            zx_time_sub_time(create, start) / 1e9,
50            zx_time_sub_time(join, create) / 1e9);
51    }
52    return 0;
53}
54