qemu/tests/tcg/multiarch/threadcount.c
<<
>>
Prefs
   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
  22int max_threads = 10;
  23
  24typedef struct {
  25    int delay;
  26} ThreadArg;
  27
  28static void *thread_fn(void* varg)
  29{
  30    ThreadArg *arg = varg;
  31    usleep(arg->delay);
  32    free(arg);
  33    return NULL;
  34}
  35
  36int 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