| | 11 | #include <pthread.h> |
|---|
| | 12 | |
|---|
| | 13 | int maxfds; |
|---|
| | 14 | struct { |
|---|
| | 15 | eventer_t e; |
|---|
| | 16 | pthread_t executor; |
|---|
| | 17 | noit_spinlock_t lock; |
|---|
| | 18 | } **master_fds; |
|---|
| | 19 | |
|---|
| | 20 | int kqueue_fd; |
|---|
| | 21 | typedef struct kqueue_setup { |
|---|
| | 22 | struct kevent *__ke_vec; |
|---|
| | 23 | unsigned int __ke_vec_a; |
|---|
| | 24 | unsigned int __ke_vec_used; |
|---|
| | 25 | } * kqs_t; |
|---|
| | 26 | |
|---|
| | 27 | static pthread_mutex_t kqs_lock; |
|---|
| | 28 | static kqs_t master_kqs = NULL; |
|---|
| | 29 | static pthread_key_t kqueue_setup_key; |
|---|
| | 30 | #define KQUEUE_DECL kqs_t kqs |
|---|
| | 31 | #define KQUEUE_SETUP kqs = (kqs_t) pthread_getspecific(kqueue_setup_key) |
|---|
| | 32 | #define ke_vec kqs->__ke_vec |
|---|
| | 33 | #define ke_vec_a kqs->__ke_vec_a |
|---|
| | 34 | #define ke_vec_used kqs->__ke_vec_used |
|---|
| | 35 | |
|---|
| | 36 | static void |
|---|
| | 37 | ke_change (register int const ident, |
|---|
| | 38 | register int const filter, |
|---|
| | 39 | register int const flags, |
|---|
| | 40 | register void *const udata) { |
|---|
| | 41 | enum { initial_alloc = 64 }; |
|---|
| | 42 | register struct kevent *kep; |
|---|
| | 43 | KQUEUE_DECL; |
|---|
| | 44 | |
|---|
| | 45 | KQUEUE_SETUP; |
|---|
| | 46 | if (!ke_vec_a) { |
|---|
| | 47 | ke_vec_a = initial_alloc; |
|---|
| | 48 | ke_vec = (struct kevent *) malloc(ke_vec_a * sizeof (struct kevent)); |
|---|
| | 49 | } |
|---|
| | 50 | else if (ke_vec_used == ke_vec_a) { |
|---|
| | 51 | ke_vec_a <<= 1; |
|---|
| | 52 | ke_vec = (struct kevent *) realloc(ke_vec, |
|---|
| | 53 | ke_vec_a * sizeof (struct kevent)); |
|---|
| | 54 | } |
|---|
| | 55 | kep = &ke_vec[ke_vec_used++]; |
|---|
| | 56 | |
|---|
| | 57 | EV_SET(kep, ident, filter, flags, 0, 0, udata); |
|---|
| | 58 | } |
|---|