radix: Implement radix_tree_destroy()
[akaros.git] / user / utest / signal.c
1 #include <utest/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<100000; i++)
18                         pthread_yield();
19                 return 0;
20         }
21         void signal_handler(int signo)
22         {
23                 sigphandle = pthread_self();
24                 __sync_fetch_and_add(&count, 1);
25         }
26
27         struct sigaction sigact = {.sa_handler = signal_handler, 0};
28         sigaction(SIGUSR1, &sigact, 0);
29         sigaction(SIGUSR2, &sigact, 0);
30
31         pthread_t phandle;
32         pthread_create(&phandle, NULL, thread_handler, NULL);
33         for (int i=0; i<100; i++)
34                 pthread_yield();
35         pthread_kill(phandle, SIGUSR1);
36         pthread_kill(phandle, SIGUSR2);
37         pthread_join(phandle, NULL);
38
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