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
|
||||
|
||||
threadcount: LDFLAGS+=-lpthread
|
||||
|
||||
# We define the runner for test-mmap after the individual
|
||||
# architectures have defined their supported pages sizes. If no
|
||||
# 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