13 static int num_events
;
16 kqh_register_event(VALUE klass
, VALUE pid
, VALUE event
)
18 struct kevent new_event
;
22 if (proc_exit
== SYM2ID(event
)) {
25 rb_raise(rb_eNotImpError
, "Event `%s` not implemented", rb_id2name(event
));
28 EV_SET(&new_event
, FIX2UINT(pid
), EVFILT_PROC
,
29 EV_ADD
| EV_ENABLE
, fflags
, 0, 0);
31 if (-1 == kevent(kq
, &new_event
, 1, NULL
, 0, NULL
)) {
32 rb_raise(rb_eStandardError
, strerror(errno
));
43 struct kevent
*events
= (struct kevent
*)malloc(num_events
* sizeof(struct kevent
));
46 rb_raise(rb_eStandardError
, strerror(errno
));
48 nevents
= kevent(kq
, NULL
, 0, events
, num_events
, NULL
);
51 rb_raise(rb_eStandardError
, strerror(errno
));
53 for (i
= 0; i
< nevents
; i
++) {
54 if (events
[i
].fflags
& NOTE_EXIT
) {
55 rb_funcall(cEventHandler
, call
, 1, INT2NUM(events
[i
].ident
));
62 return INT2FIX(nevents
);
65 void Init_kqueue_handler() {
69 rb_raise(rb_eStandardError
, "kqueue initilization failed");
71 proc_exit
= rb_intern("proc_exit");
72 call
= rb_intern("call");
74 mGod
= rb_const_get(rb_cObject
, rb_intern("God"));
75 cEventHandler
= rb_const_get(mGod
, rb_intern("EventHandler"));
76 cKQueueHandler
= rb_define_class_under(mGod
, "KQueueHandler", rb_cObject
);
77 rb_define_singleton_method(cKQueueHandler
, "register_event", kqh_register_event
, 2);
78 rb_define_singleton_method(cKQueueHandler
, "handle_events", kqh_handle_events
, 0);