1 // SPDX-License-Identifier: GPL-2.0
2 #include <test_progs.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <sys/mman.h>
6 #include <pthread.h>
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <fcntl.h>
10 #include "test_send_signal_kern.skel.h"
11 
12 static void sigusr1_handler(int signum)
13 {
14 }
15 
16 #define THREAD_COUNT 100
17 
18 static void *worker(void *p)
19 {
20 	int i;
21 
22 	for ( i = 0; i < 1000; i++)
23 		usleep(1);
24 
25 	return NULL;
26 }
27 
28 void test_send_signal_sched_switch(void)
29 {
30 	struct test_send_signal_kern *skel;
31 	pthread_t threads[THREAD_COUNT];
32 	u32 duration = 0;
33 	int i, err;
34 
35 	signal(SIGUSR1, sigusr1_handler);
36 
37 	skel = test_send_signal_kern__open_and_load();
38 	if (CHECK(!skel, "skel_open_and_load", "skeleton open_and_load failed\n"))
39 		return;
40 
41 	skel->bss->pid = getpid();
42 	skel->bss->sig = SIGUSR1;
43 
44 	err = test_send_signal_kern__attach(skel);
45 	if (CHECK(err, "skel_attach", "skeleton attach failed\n"))
46 		goto destroy_skel;
47 
48 	for (i = 0; i < THREAD_COUNT; i++) {
49 		err = pthread_create(threads + i, NULL, worker, NULL);
50 		if (CHECK(err, "pthread_create", "Error creating thread, %s\n",
51 			  strerror(errno)))
52 			goto destroy_skel;
53 	}
54 
55 	for (i = 0; i < THREAD_COUNT; i++)
56 		pthread_join(threads[i], NULL);
57 
58 destroy_skel:
59 	test_send_signal_kern__destroy(skel);
60 }
61