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