xref: /dragonfly/test/debug/evfilt_user.c (revision 0ca59c34)
1 /*
2  * cc evfilt_user.c -pthread -I/usr/src/sys/ -o /tmp/evfilt_user
3  */
4 
5 #include <sys/types.h>
6 #include <sys/event.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <pthread.h>
10 
11 static void *domaster(void *arg);
12 static void *doslave(void *arg);
13 
14 int
15 main(int ac, char **avj)
16 {
17     int fd;
18     int r;
19     struct kevent kev;
20     pthread_t td1;
21     pthread_t td2;
22 
23     fd = kqueue();
24     EV_SET(&kev, 1, EVFILT_USER, EV_ADD|EV_CLEAR, 0, 0, 0);
25     r = kevent(fd, &kev, 1, NULL, 0, NULL);
26     printf("r = %d\n", r);
27     pthread_create(&td1, NULL, domaster, (void *)(intptr_t)fd);
28     sleep(1);
29     pthread_create(&td2, NULL, doslave, (void *)(intptr_t)fd);
30     pthread_join(td1, NULL);
31     pthread_join(td2, NULL);
32 }
33 
34 static void *
35 domaster(void *arg)
36 {
37 	struct kevent kev;
38 	int fd = (int)(intptr_t)arg;
39 	int r;
40 
41 	printf("master running\n");
42 	for (;;) {
43 		EV_SET(&kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, 0);
44 		r = kevent(fd, &kev, 1, NULL, 0, NULL);
45 		printf("issued trigger %d\n", r);
46 		sleep(1);
47 	}
48 
49 	return NULL;
50 }
51 
52 static void *
53 doslave(void *arg)
54 {
55 	struct kevent kev;
56 	int fd = (int)(intptr_t)arg;
57 	int r;
58 
59 	printf("slave running\n");
60 	for (;;) {
61 		r = kevent(fd, NULL, 0, &kev, 1, NULL);
62 		printf("received %d\n", r);
63 		/*
64 		EV_SET(&kev, 1, EVFILT_USER, EV_CLEAR, 0, 0, 0);
65 		r = kevent(fd, &kev, 1, NULL, 0, NULL);
66 		*/
67 	}
68 	return NULL;
69 }
70