ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/s_bsd_select.c
Revision: 2916
Committed: Sat Jan 25 21:09:18 2014 UTC (11 years, 7 months ago) by michael
Content type: text/x-csrc
File size: 4668 byte(s)
Log Message:
- Clean up all files in include/ (fixed indentation, removed whitespaces/tabs)
- Fixed copyright years

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3 *
4 * Copyright (c) 2000-2014 ircd-hybrid development team
5 *
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 /*! \file s_bsd_select.c
23 * \brief select() compatible network routines.
24 * \version $Id$
25 */
26
27 #include "stdinc.h"
28 #if USE_IOPOLL_MECHANISM == __IOPOLL_MECHANISM_SELECT
29 #include "list.h"
30 #include "fdlist.h"
31 #include "hook.h"
32 #include "ircd.h"
33 #include "s_bsd.h"
34 #include "log.h"
35
36 /*
37 * Note that this is only a single list - multiple lists is kinda pointless
38 * under select because the list size is a function of the highest FD :-)
39 * -- adrian
40 */
41
42 static fd_set select_readfds, tmpreadfds;
43 static fd_set select_writefds, tmpwritefds;
44 static int highest_fd = -1;
45
46
47 /*
48 * init_netio
49 *
50 * This is a needed exported function which will be called to initialise
51 * the network loop code.
52 */
53 void
54 init_netio(void)
55 {
56 FD_ZERO(&select_readfds);
57 FD_ZERO(&select_writefds);
58 }
59
60 /*
61 * comm_setselect
62 *
63 * This is a needed exported function which will be called to register
64 * and deregister interest in a pending IO state for a given FD.
65 */
66 void
67 comm_setselect(fde_t *F, unsigned int type, PF *handler,
68 void *client_data, time_t timeout)
69 {
70 int new_events;
71
72 if ((type & COMM_SELECT_READ))
73 {
74 F->read_handler = handler;
75 F->read_data = client_data;
76 }
77
78 if ((type & COMM_SELECT_WRITE))
79 {
80 F->write_handler = handler;
81 F->write_data = client_data;
82 }
83
84 new_events = (F->read_handler ? COMM_SELECT_READ : 0) |
85 (F->write_handler ? COMM_SELECT_WRITE : 0);
86
87 if (timeout != 0)
88 {
89 F->timeout = CurrentTime + (timeout / 1000);
90 F->timeout_handler = handler;
91 F->timeout_data = client_data;
92 }
93
94 if (new_events != F->evcache)
95 {
96 if ((new_events & COMM_SELECT_READ))
97 FD_SET(F->fd, &select_readfds);
98 else
99 {
100 FD_CLR(F->fd, &select_readfds);
101 FD_CLR(F->fd, &tmpreadfds);
102 }
103
104 if ((new_events & COMM_SELECT_WRITE))
105 FD_SET(F->fd, &select_writefds);
106 else
107 {
108 FD_CLR(F->fd, &select_writefds);
109 FD_CLR(F->fd, &tmpwritefds);
110 }
111
112 if (new_events == 0)
113 {
114 if (highest_fd == F->fd)
115 while (highest_fd >= 0 && (FD_ISSET(highest_fd, &select_readfds) ||
116 FD_ISSET(highest_fd, &select_writefds)))
117 highest_fd--;
118 }
119 else if (F->evcache == 0)
120 if (F->fd > highest_fd)
121 highest_fd = F->fd;
122
123 F->evcache = new_events;
124 }
125 }
126
127 /*
128 * comm_select
129 *
130 * Called to do the new-style IO, courtesy of squid (like most of this
131 * new IO code). This routine handles the stuff we've hidden in
132 * comm_setselect and fd_table[] and calls callbacks for IO ready
133 * events.
134 */
135 void
136 comm_select(void)
137 {
138 struct timeval to;
139 int num, fd;
140 fde_t *F;
141 PF *hdl;
142
143 /* Copy over the read/write sets so we don't have to rebuild em */
144 memcpy(&tmpreadfds, &select_readfds, sizeof(fd_set));
145 memcpy(&tmpwritefds, &select_writefds, sizeof(fd_set));
146
147 to.tv_sec = 0;
148 to.tv_usec = SELECT_DELAY * 1000;
149 num = select(highest_fd + 1, &tmpreadfds, &tmpwritefds, NULL, &to);
150
151 set_time();
152
153 if (num < 0)
154 {
155 #ifdef HAVE_USLEEP
156 usleep(50000);
157 #endif
158 return;
159 }
160
161 for (fd = 0; fd <= highest_fd && num > 0; fd++)
162 {
163 if (FD_ISSET(fd, &tmpreadfds) || FD_ISSET(fd, &tmpwritefds))
164 {
165 num--;
166
167 F = lookup_fd(fd);
168 if (F == NULL || !F->flags.open)
169 continue;
170
171 if (FD_ISSET(fd, &tmpreadfds))
172 {
173 if ((hdl = F->read_handler) != NULL)
174 {
175 F->read_handler = NULL;
176 hdl(F, F->read_data);
177 if (!F->flags.open)
178 continue;
179 }
180 }
181
182 if (FD_ISSET(fd, &tmpwritefds))
183 {
184 if ((hdl = F->write_handler) != NULL)
185 {
186 F->write_handler = NULL;
187 hdl(F, F->write_data);
188 if (!F->flags.open)
189 continue;
190 }
191 }
192
193 comm_setselect(F, 0, NULL, NULL, 0);
194 }
195 }
196 }
197 #endif

Properties

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