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>
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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;
 | 
						|
}
 |