blob: 339601c0beb598603ba83707ff645336f4cdd4f0 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <threads.h>
#include <time.h>
#include <zircon/syscalls.h>
#include <stdatomic.h>
static atomic_uint_fast64_t count = ATOMIC_VAR_INIT(0);
static int thread_func(void* arg) {
uint64_t val = atomic_fetch_add(&count, 1);
val++;
if (val % 1000 == 0) {
printf("Created %" PRId64 " threads, time %" PRId64 " us\n", val,
zx_time_get(ZX_CLOCK_MONOTONIC) / 1000000);
}
thrd_t thread;
int ret = thrd_create_with_name(&thread, thread_func, NULL, "depth");
if (ret == thrd_success) {
ret = thrd_join(thread, NULL);
if (ret != thrd_success) {
printf("Unexpected thread join return: %d\n", ret);
return 1;
}
val = atomic_fetch_sub(&count, 1);
val--;
if (val % 1000 == 0)
printf("Joined %" PRId64 " threads, time %" PRId64 " us\n", val,
zx_time_get(ZX_CLOCK_MONOTONIC) / 1000000);
}
return 0;
}
int main(int argc, char** argv) {
printf("Running thread depth test...\n");
thrd_t thread;
int ret = thrd_create_with_name(&thread, thread_func, NULL, "depth");
ret = thrd_join(thread, NULL);
if (ret != thrd_success) {
printf("Unexpected thread join return: %d\n", ret);
return 1;
}
// TODO(phosek): The cast here shouldn't be required.
printf("Created %" PRIdFAST64 " threads\n", (uint_fast64_t)atomic_load(&count));
return 0;
}