Implement pthead_kill() and sigmask stuff for pthreads
[akaros.git] / user / utest / signal.c
1 #include <utest.h>
2 #include <pthread.h>
3
4 TEST_SUITE("SIGNALS");
5
6 /* <--- Begin definition of test cases ---> */
7
8 bool test_sigmask(void) {
9         int count = 0;
10         pthread_t sigphandle;
11         void *thread_handler(void *arg)
12         {
13                 sigset_t s;
14                 sigemptyset(&s);
15                 sigaddset(&s, SIGUSR2);
16                 pthread_sigmask(SIG_BLOCK, &s, NULL);
17                 for (int i=0; i<1000; i++)
18                         pthread_yield();
19         }
20         void signal_handler(int signo)
21         {
22                 sigphandle = pthread_self();
23                 __sync_fetch_and_add(&count, 1);
24         }
25
26         struct sigaction sigact = {.sa_handler = signal_handler, 0};
27         sigaction(SIGUSR1, &sigact, 0);
28         sigaction(SIGUSR2, &sigact, 0);
29
30         pthread_t phandle;
31         pthread_create(&phandle, NULL, thread_handler, NULL);
32         for (int i=0; i<100; i++)
33                 pthread_yield();
34         pthread_kill(phandle, SIGUSR1);
35         pthread_kill(phandle, SIGUSR2);
36         pthread_join(phandle, NULL);
37
38         printf("count: %d\n", count);
39         UT_ASSERT_M("Should only receive one signal", count == 1); 
40         UT_ASSERT_M("Signal handler run on wrong thread", sigphandle == phandle); 
41         return true;
42 }
43
44 /* <--- End definition of test cases ---> */
45
46 struct utest utests[] = {
47         UTEST_REG(sigmask),
48 };
49 int num_utests = sizeof(utests) / sizeof(struct utest);
50
51 int main(int argc, char *argv[]) {
52         // Run test suite passing it all the args as whitelist of what tests to run.
53         char **whitelist = &argv[1];
54         int whitelist_len = argc - 1;
55         RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len);
56 }
57
58