Fixed ISOR problem and legacy pic patch.
[akaros.git] / tests / signal_futex.c
1 /* Copyright (c) 2014 The Regents of the University of California
2  * Kevin Klues <klueska@cs.berkeley.edu>
3  * See LICENSE for details.
4  */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <parlib/parlib.h>
10 #include <pthread.h>
11 #include <futex.h>
12 #include <signal.h>
13
14 // Signal handler run in vcore context which redirects signals to userspace by
15 // waking a thread waiting on a futex. Note, this does not guarantee that every
16 // signal that comes through this handler will be noticed or processed by the
17 // thread.
18 int __sigpending = 0;
19 void sig_handler(int signr) {
20         __sigpending = 1;
21         futex(&__sigpending, FUTEX_WAKE, INT_MAX, NULL, NULL, 0);
22 }
23
24 // User level thread waiting on a futex to count signals
25 int count = 0;
26 void *count_signals(void *arg) {
27         while(1) {
28                 futex(&__sigpending, FUTEX_WAIT, 0, NULL, NULL, 0);
29                 __sync_fetch_and_add(&count, 1);
30                 __sigpending = 0;
31         }
32 }
33
34 // Thread spamming us with signals
35 void *sig_thread(void *arg) {
36         int *done = (int*)arg;
37         struct sigaction sigact = {.sa_handler = sig_handler, 0};
38         sigaction(SIGUSR1, &sigact, 0);
39         while(1) {
40                 kill(getpid(), SIGUSR1);
41                 cmb();
42                 if (*done) return NULL;
43         }
44 }
45
46 int main(int argc, char **argv)
47 {
48         int done = false;
49         pthread_t pth_handle, pth_handle2;
50         // Spawn off a thread to spam us with signals
51         pthread_create(&pth_handle, NULL, &sig_thread, &done);
52         // Spawn off a thread to process those signals
53         pthread_create(&pth_handle2, NULL, &count_signals, NULL);
54         // Sleep for 3 seconds by timing out on a futex
55         int dummy = 0;
56         struct timespec timeout = {.tv_sec = 3, 0};
57         futex(&dummy, FUTEX_WAIT, 0, &timeout, NULL, 0);
58         // Force the signal tread to exit
59         cmb();
60         done = true;
61         pthread_join(pth_handle, NULL);
62         printf("count: %d\n", count);
63         return 0;
64 }