;; -*- Mode: Irken -*-
(include "lib/basis.scm")
(cinclude "sys/types.h")
(cinclude "sys/event.h")
(define (kqueue)
(%%cexp (-> int) "kqueue()"))
;; filters
(define EVFILT_READ (%%cexp int "EVFILT_READ"))
(define EVFILT_WRITE (%%cexp int "EVFILT_WRITE"))
(define EVFILT_AIO (%%cexp int "EVFILT_AIO"))
(define EVFILT_VNODE (%%cexp int "EVFILT_VNODE"))
(define EVFILT_PROC (%%cexp int "EVFILT_PROC"))
(define EVFILT_SIGNAL (%%cexp int "EVFILT_SIGNAL"))
(define EVFILT_MACHPORT (%%cexp int "EVFILT_MACHPORT"))
(define EVFILT_TIMER (%%cexp int "EVFILT_TIMER"))
(define EVFILT_SESSION (%%cexp int "EVFILT_SESSION"))
(define EVFILT_SYSCOUNT (%%cexp int "EVFILT_SYSCOUNT"))
;; flags
(define EV_ADD (%%cexp int "EV_ADD"))
(define EV_ENABLE (%%cexp int "EV_ENABLE"))
(define EV_DISABLE (%%cexp int "EV_DISABLE"))
(define EV_DELETE (%%cexp int "EV_DELETE"))
(define EV_RECEIPT (%%cexp int "EV_RECEIPT"))
(define EV_ONESHOT (%%cexp int "EV_ONESHOT"))
(define EV_CLEAR (%%cexp int "EV_CLEAR"))
(define EV_EOF (%%cexp int "EV_EOF"))
(define EV_ERROR (%%cexp int "EV_ERROR"))
(define EV_ADDONE (%%cexp int "EV_ADD|EV_ONESHOT"))
(define (make-changelist n)
{size=n
index=0
buffer = (%callocate (struct kevent) n)
})
(define (add-kevent changes ident filter flags) ;; fflags data udata
(if (< changes.index changes.size)
(begin
(%%cexp ((buffer (struct kevent)) int int int int -> undefined)
"EV_SET (%0+%1, %2, %3, %4, 0, 0, 0)"
changes.buffer changes.index ident filter flags)
(set! changes.index (+ 1 changes.index)))
(error1 "changes overflowed" changes.index)))
(define (get-kevent changes i)
(:kev
(%%cexp ((buffer (struct kevent)) int -> int) "%0[%1].ident" changes.buffer i)
(%%cexp ((buffer (struct kevent)) int -> int) "%0[%1].filter" changes.buffer i)
;; eventually fill in with flags/data/udata
))
(define (kevent kqfd changes-in changes-out)
(%%cexp (int (buffer (struct kevent)) int (buffer (struct kevent)) int -> int)
"kevent (%0, %1, %2, %3, %4, NULL)"
kqfd
changes-in.buffer changes-in.index
changes-out.buffer changes-out.size
))