ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/s_bsd_kqueue.c
Revision: 3984
Committed: Wed Jun 18 13:24:34 2014 UTC (11 years, 2 months ago) by michael
Content type: text/x-csrc
File size: 4685 byte(s)
Log Message:
- s_bsd_epoll.c, s_bsd_kqueue.c: removed defines/prototypes for extremely outdated systems

File Contents

# User Rev Content
1 adx 30 /*
2 michael 2916 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3 adx 30 *
4 michael 2916 * Copyright (c) 2000-2014 ircd-hybrid development team
5 adx 30 *
6     * This program is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19     * USA
20     */
21    
22 michael 2916 /*! \file s_bsd_kqueue.c
23     * \brief kqueue() compatible network routines.
24     * \version $Id$
25     */
26    
27 adx 30 #include "stdinc.h"
28 stu 908 #if USE_IOPOLL_MECHANISM == __IOPOLL_MECHANISM_KQUEUE
29 adx 30 #include <sys/event.h>
30     #include "fdlist.h"
31     #include "ircd.h"
32     #include "memory.h"
33     #include "s_bsd.h"
34 michael 1309 #include "log.h"
35 adx 30
36     #define KE_LENGTH 128
37    
38     static fde_t kqfd;
39     static struct kevent kq_fdlist[KE_LENGTH]; /* kevent buffer */
40     static int kqoff; /* offset into the buffer */
41    
42 michael 3984
43 adx 30 /*
44     * init_netio
45     *
46     * This is a needed exported function which will be called to initialise
47     * the network loop code.
48     */
49     void
50     init_netio(void)
51     {
52     int fd;
53    
54     if ((fd = kqueue()) < 0)
55     {
56 michael 1247 ilog(LOG_TYPE_IRCD, "init_netio: Couldn't open kqueue fd!");
57 adx 30 exit(115); /* Whee! */
58     }
59    
60     fd_open(&kqfd, fd, 0, "kqueue() file descriptor");
61     }
62    
63     /*
64     * Write a single update to the kqueue list.
65     */
66     static void
67     kq_update_events(int fd, int filter, int what)
68     {
69     static struct timespec zero_timespec = {0, 0};
70     struct kevent *kep = kq_fdlist + kqoff;
71    
72     EV_SET(kep, (uintptr_t) fd, (short) filter, what, 0, 0, NULL);
73    
74 adx 842 if (++kqoff == KE_LENGTH)
75 adx 30 {
76 michael 2589 int i;
77    
78     for (i = 0; i < kqoff; ++i)
79 michael 2613 kevent(kqfd.fd, &kq_fdlist[i], 1, NULL, 0, &zero_timespec);
80 adx 30 kqoff = 0;
81     }
82     }
83    
84     /*
85     * comm_setselect
86     *
87     * This is a needed exported function which will be called to register
88     * and deregister interest in a pending IO state for a given FD.
89     */
90     void
91     comm_setselect(fde_t *F, unsigned int type, PF *handler,
92     void *client_data, time_t timeout)
93     {
94     int new_events, diff;
95    
96     if ((type & COMM_SELECT_READ))
97     {
98     F->read_handler = handler;
99     F->read_data = client_data;
100     }
101    
102     if ((type & COMM_SELECT_WRITE))
103     {
104     F->write_handler = handler;
105     F->write_data = client_data;
106     }
107    
108     new_events = (F->read_handler ? COMM_SELECT_READ : 0) |
109 michael 2650 (F->write_handler ? COMM_SELECT_WRITE : 0);
110 adx 30
111     if (timeout != 0)
112 michael 2725 {
113 adx 30 F->timeout = CurrentTime + (timeout / 1000);
114 michael 2725 F->timeout_handler = handler;
115     F->timeout_data = client_data;
116     }
117 adx 30
118     diff = new_events ^ F->evcache;
119    
120     if ((diff & COMM_SELECT_READ))
121     kq_update_events(F->fd, EVFILT_READ,
122     (new_events & COMM_SELECT_READ) ? EV_ADD : EV_DELETE);
123     if ((diff & COMM_SELECT_WRITE))
124     kq_update_events(F->fd, EVFILT_WRITE,
125     (new_events & COMM_SELECT_WRITE) ? EV_ADD : EV_DELETE);
126    
127     F->evcache = new_events;
128     }
129    
130     /*
131     * comm_select
132     *
133     * Called to do the new-style IO, courtesy of squid (like most of this
134     * new IO code). This routine handles the stuff we've hidden in
135     * comm_setselect and fd_table[] and calls callbacks for IO ready
136     * events.
137     */
138     void
139     comm_select(void)
140     {
141     int num, i;
142     static struct kevent ke[KE_LENGTH];
143     struct timespec poll_time;
144     PF *hdl;
145     fde_t *F;
146    
147     /*
148     * remember we are doing NANOseconds here, not micro/milli. God knows
149     * why jlemon used a timespec, but hey, he wrote the interface, not I
150     * -- Adrian
151     */
152     poll_time.tv_sec = 0;
153     poll_time.tv_nsec = SELECT_DELAY * 1000000;
154     num = kevent(kqfd.fd, kq_fdlist, kqoff, ke, KE_LENGTH, &poll_time);
155     kqoff = 0;
156    
157     set_time();
158    
159     if (num < 0)
160     {
161     #ifdef HAVE_USLEEP
162     usleep(50000); /* avoid 99% CPU in comm_select */
163     #endif
164     return;
165     }
166    
167     for (i = 0; i < num; i++)
168     {
169     F = lookup_fd(ke[i].ident);
170     if (F == NULL || !F->flags.open || (ke[i].flags & EV_ERROR))
171     continue;
172    
173     if (ke[i].filter == EVFILT_READ)
174 michael 2650 {
175 adx 30 if ((hdl = F->read_handler) != NULL)
176     {
177     F->read_handler = NULL;
178     hdl(F, F->read_data);
179 michael 2614 if (!F->flags.open)
180     continue;
181 adx 30 }
182 michael 2650 }
183 adx 30
184     if (ke[i].filter == EVFILT_WRITE)
185 michael 2650 {
186 adx 30 if ((hdl = F->write_handler) != NULL)
187     {
188     F->write_handler = NULL;
189     hdl(F, F->write_data);
190 michael 2614 if (!F->flags.open)
191     continue;
192 adx 30 }
193 michael 2650 }
194 adx 30
195     comm_setselect(F, 0, NULL, NULL, 0);
196     }
197     }
198 stu 908 #endif

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision