cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

threadcount.c (1373B)


      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}