mirror of
https://github.com/qemu/qemu.git
synced 2025-08-09 19:05:29 +00:00
tests/tcg: add new threadcount test
Based on the original testcase by Nikolay Igotti. Message-ID: <CAEme+7GLKg_dNsHizzTKDymX9HyD+Ph2iZ=WKhOw2XG+zhViXg@mail.gmail.com> Signed-off-by: Nikolay Igotti <igotti@gmail.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20200520140541.30256-15-alex.bennee@linaro.org>
This commit is contained in:
parent
1f81ce90e3
commit
919bfbf5d6
@ -28,6 +28,8 @@ run-float_%: float_%
|
|||||||
|
|
||||||
testthread: LDFLAGS+=-lpthread
|
testthread: LDFLAGS+=-lpthread
|
||||||
|
|
||||||
|
threadcount: LDFLAGS+=-lpthread
|
||||||
|
|
||||||
# We define the runner for test-mmap after the individual
|
# We define the runner for test-mmap after the individual
|
||||||
# architectures have defined their supported pages sizes. If no
|
# architectures have defined their supported pages sizes. If no
|
||||||
# additional page sizes are defined we only run the default test.
|
# additional page sizes are defined we only run the default test.
|
||||||
|
64
tests/tcg/multiarch/threadcount.c
Normal file
64
tests/tcg/multiarch/threadcount.c
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Thread Exerciser
|
||||||
|
*
|
||||||
|
* Unlike testthread which is mainly concerned about testing thread
|
||||||
|
* semantics this test is used to exercise the thread creation and
|
||||||
|
* accounting. A version of this test found a problem with clashing
|
||||||
|
* cpu_indexes which caused a break in plugin handling.
|
||||||
|
*
|
||||||
|
* Based on the original test case by Nikolay Igotti.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 Linaro Ltd
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
int max_threads = 10;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int delay;
|
||||||
|
} ThreadArg;
|
||||||
|
|
||||||
|
static void *thread_fn(void* varg)
|
||||||
|
{
|
||||||
|
ThreadArg *arg = varg;
|
||||||
|
usleep(arg->delay);
|
||||||
|
free(arg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
pthread_t *threads;
|
||||||
|
|
||||||
|
if (argc > 1) {
|
||||||
|
max_threads = atoi(argv[1]);
|
||||||
|
}
|
||||||
|
threads = calloc(sizeof(pthread_t), max_threads);
|
||||||
|
|
||||||
|
for (i = 0; i < max_threads; i++) {
|
||||||
|
ThreadArg *arg = calloc(sizeof(ThreadArg), 1);
|
||||||
|
arg->delay = i * 100;
|
||||||
|
pthread_create(threads + i, NULL, thread_fn, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Created %d threads\n", max_threads);
|
||||||
|
|
||||||
|
/* sleep until roughly half the threads have "finished" */
|
||||||
|
usleep(max_threads * 50);
|
||||||
|
|
||||||
|
for (i = 0; i < max_threads; i++) {
|
||||||
|
pthread_join(threads[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Done\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user