source: branches/ithildin-1.1/source/poller_kqueue.c @ 578

Revision 578, 2.1 KB checked in by wd, 7 years ago (diff)

Expand tabs ('\t') to eight spaces.

  • Property svn:keywords set to Id Rev
Line 
1/*
2 * poller_kqueue.c: kernel queue polling mechanism
3 *
4 * Copyright 2002 the Ithildin Project.
5 * See the COPYING file for more information on licensing and use.
6 */
7
8IDSTRING(poller_rcsid, "$Id$");
9
10int poll_sockets(time_t timeout) {
11    struct timespec tv = {timeout, 0};
12    struct kevent *ke = kev_list;
13    int ret = kevent(kqueuefd, kev_change, kev_num_changes, ke,
14            (signed int)maxsockets * 2, (timeout ? &tv : NULL));
15    struct isocket *sp;
16
17    if (ret == -1 && errno != EINTR) {
18        log_error("kevent(%d, %p, %d, %p, %d, %p) error: %s", kqueuefd,
19                kev_change, kev_num_changes, ke, maxsockets * 2, &tv,
20                strerror(errno));
21        return 0;
22    } else if (ret <= 0)
23        return 1; /* nothing to do, ho-hum */
24
25    kev_num_changes = 0; /* changes have been made.  nifty */
26
27    me.now = time(NULL);
28    for (ret--;ret > -1;ret--) {
29        if (ke[ret].flags & EV_ERROR)
30            log_debug("kevent error on %d/%d: %s", ke[ret].ident,
31                    ke[ret].filter, strerror(ke[ret].data));
32        else if (ke[ret].udata != NULL) {
33            sp = ke[ret].udata;
34            if (ke[ret].filter == EVFILT_READ) {
35                if (ke[ret].flags & EV_EOF) {
36                    sp->state |= SOCKET_FL_ERROR_PENDING;
37                    sp->err = ke[ret].fflags;
38                }
39                sp->state |= SOCKET_FL_READ_PENDING;
40            } else if (ke[ret].filter == EVFILT_WRITE) {
41                if (ke[ret].flags & EV_EOF) {
42                    sp->state |= SOCKET_FL_ERROR_PENDING;
43                    sp->err = ke[ret].fflags;
44                }
45                else {
46                    sp->state |= SOCKET_FL_WRITE_PENDING;
47                    socket_unmonitor(sp, SOCKET_FL_WRITE);
48                }
49            } else
50                log_warn("unknown kqueue filter %d given!", ke[ret].filter);
51        }
52    }
53
54    LIST_FOREACH(sp, &allsockets, intlp) {
55        if (SOCKET_DEAD(sp) || sp->fd < 0)
56            continue; /* dead socket. */
57
58        if (sp->state & SOCKET_FL_PENDING)
59            socket_event(sp);
60    }
61
62    return 1;
63}
64
65/* vi:set ts=8 sts=4 sw=4 tw=76 et: */
Note: See TracBrowser for help on using the repository browser.