rev 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,155 @@
1
+ /*
2
+ * libev solaris event port backend
3
+ *
4
+ * Copyright (c) 2007 Marc Alexander Lehmann <libev@schmorp.de>
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are
9
+ * met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ *
14
+ * * Redistributions in binary form must reproduce the above
15
+ * copyright notice, this list of conditions and the following
16
+ * disclaimer in the documentation and/or other materials provided
17
+ * with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ */
31
+
32
+ #include <sys/types.h>
33
+ #include <sys/time.h>
34
+ #include <poll.h>
35
+ #include <port.h>
36
+ #include <string.h>
37
+ #include <errno.h>
38
+
39
+ void inline_speed
40
+ port_associate_and_check (EV_P_ int fd, int ev)
41
+ {
42
+ if (0 >
43
+ port_associate (
44
+ backend_fd, PORT_SOURCE_FD, fd,
45
+ (ev & EV_READ ? POLLIN : 0)
46
+ | (ev & EV_WRITE ? POLLOUT : 0),
47
+ 0
48
+ )
49
+ )
50
+ {
51
+ if (errno == EBADFD)
52
+ fd_kill (EV_A_ fd);
53
+ else
54
+ syserr ("(libev) port_associate");
55
+ }
56
+ }
57
+
58
+ static void
59
+ port_modify (EV_P_ int fd, int oev, int nev)
60
+ {
61
+ /* we need to reassociate no matter what, as closes are
62
+ * once more silently being discarded.
63
+ */
64
+ if (!nev)
65
+ {
66
+ if (oev)
67
+ port_dissociate (backend_fd, PORT_SOURCE_FD, fd);
68
+ }
69
+ else
70
+ port_associate_and_check (EV_A_ fd, nev);
71
+ }
72
+
73
+ static void
74
+ port_poll (EV_P_ ev_tstamp timeout)
75
+ {
76
+ int res, i;
77
+ struct timespec ts;
78
+ uint_t nget = 1;
79
+
80
+ ts.tv_sec = (time_t)timeout;
81
+ ts.tv_nsec = (long)(timeout - (ev_tstamp)ts.tv_sec) * 1e9;
82
+ res = port_getn (backend_fd, port_events, port_eventmax, &nget, &ts);
83
+
84
+ if (res < 0)
85
+ {
86
+ if (errno != EINTR && errno != ETIME)
87
+ syserr ("(libev) port_getn");
88
+
89
+ return;
90
+ }
91
+
92
+ for (i = 0; i < nget; ++i)
93
+ {
94
+ if (port_events [i].portev_source == PORT_SOURCE_FD)
95
+ {
96
+ int fd = port_events [i].portev_object;
97
+
98
+ fd_event (
99
+ EV_A_
100
+ fd,
101
+ (port_events [i].portev_events & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0)
102
+ | (port_events [i].portev_events & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0)
103
+ );
104
+
105
+ port_associate_and_check (EV_A_ fd, anfds [fd].events);
106
+ }
107
+ }
108
+
109
+ if (expect_false (nget == port_eventmax))
110
+ {
111
+ ev_free (port_events);
112
+ port_eventmax = array_nextsize (sizeof (port_event_t), port_eventmax, port_eventmax + 1);
113
+ port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax);
114
+ }
115
+ }
116
+
117
+ int inline_size
118
+ port_init (EV_P_ int flags)
119
+ {
120
+ /* Initalize the kernel queue */
121
+ if ((backend_fd = port_create ()) < 0)
122
+ return 0;
123
+
124
+ fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */
125
+
126
+ backend_fudge = 1e-3; /* needed to compensate for port_getn returning early */
127
+ backend_modify = port_modify;
128
+ backend_poll = port_poll;
129
+
130
+ port_eventmax = 64; /* intiial number of events receivable per poll */
131
+ port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax);
132
+
133
+ return EVBACKEND_PORT;
134
+ }
135
+
136
+ void inline_size
137
+ port_destroy (EV_P)
138
+ {
139
+ ev_free (port_events);
140
+ }
141
+
142
+ void inline_size
143
+ port_fork (EV_P)
144
+ {
145
+ close (backend_fd);
146
+
147
+ while ((backend_fd = port_create ()) < 0)
148
+ syserr ("(libev) port");
149
+
150
+ fcntl (backend_fd, F_SETFD, FD_CLOEXEC);
151
+
152
+ /* re-register interest in fds */
153
+ fd_rearm_all (EV_A);
154
+ }
155
+
@@ -0,0 +1,236 @@
1
+ /*
2
+ * libev select fd activity backend
3
+ *
4
+ * Copyright (c) 2007 Marc Alexander Lehmann <libev@schmorp.de>
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are
9
+ * met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ *
14
+ * * Redistributions in binary form must reproduce the above
15
+ * copyright notice, this list of conditions and the following
16
+ * disclaimer in the documentation and/or other materials provided
17
+ * with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ */
31
+
32
+ #ifndef _WIN32
33
+ /* for unix systems */
34
+ # include <sys/select.h>
35
+ # include <inttypes.h>
36
+ #endif
37
+
38
+ #ifndef EV_SELECT_USE_FD_SET
39
+ # ifdef NFDBITS
40
+ # define EV_SELECT_USE_FD_SET 0
41
+ # else
42
+ # define EV_SELECT_USE_FD_SET 1
43
+ # endif
44
+ #endif
45
+
46
+ #if EV_SELECT_IS_WINSOCKET
47
+ # undef EV_SELECT_USE_FD_SET
48
+ # define EV_SELECT_USE_FD_SET 1
49
+ # undef EINTR
50
+ # define EINTR WSAEINTR
51
+ # undef EBADF
52
+ # define EBADF WSAENOTSOCK
53
+ # undef ENOMEM
54
+ # define ENOMEM (errno + 1)
55
+ #endif
56
+
57
+ #if !EV_SELECT_USE_FD_SET
58
+ # define NFDBYTES (NFDBITS / 8)
59
+ #endif
60
+
61
+ #include <string.h>
62
+
63
+ static void
64
+ select_modify (EV_P_ int fd, int oev, int nev)
65
+ {
66
+ if (oev == nev)
67
+ return;
68
+
69
+ {
70
+ #if EV_SELECT_USE_FD_SET
71
+
72
+ #if EV_SELECT_IS_WINSOCKET
73
+ SOCKET handle = anfds [fd].handle;
74
+ #else
75
+ int handle = fd;
76
+ #endif
77
+
78
+ if (nev & EV_READ)
79
+ FD_SET (handle, (fd_set *)vec_ri);
80
+ else
81
+ FD_CLR (handle, (fd_set *)vec_ri);
82
+
83
+ if (nev & EV_WRITE)
84
+ FD_SET (handle, (fd_set *)vec_wi);
85
+ else
86
+ FD_CLR (handle, (fd_set *)vec_wi);
87
+
88
+ #else
89
+
90
+ int word = fd / NFDBITS;
91
+ int mask = 1UL << (fd % NFDBITS);
92
+
93
+ if (expect_false (vec_max < word + 1))
94
+ {
95
+ int new_max = word + 1;
96
+
97
+ vec_ri = ev_realloc (vec_ri, new_max * NFDBYTES);
98
+ vec_ro = ev_realloc (vec_ro, new_max * NFDBYTES); /* could free/malloc */
99
+ vec_wi = ev_realloc (vec_wi, new_max * NFDBYTES);
100
+ vec_wo = ev_realloc (vec_wo, new_max * NFDBYTES); /* could free/malloc */
101
+
102
+ for (; vec_max < new_max; ++vec_max)
103
+ ((fd_mask *)vec_ri)[vec_max] =
104
+ ((fd_mask *)vec_wi)[vec_max] = 0;
105
+ }
106
+
107
+ ((fd_mask *)vec_ri) [word] |= mask;
108
+ if (!(nev & EV_READ))
109
+ ((fd_mask *)vec_ri) [word] &= ~mask;
110
+
111
+ ((fd_mask *)vec_wi) [word] |= mask;
112
+ if (!(nev & EV_WRITE))
113
+ ((fd_mask *)vec_wi) [word] &= ~mask;
114
+ #endif
115
+ }
116
+ }
117
+
118
+ static void
119
+ select_poll (EV_P_ ev_tstamp timeout)
120
+ {
121
+ struct timeval tv;
122
+ int res;
123
+
124
+ #if EV_SELECT_USE_FD_SET
125
+ memcpy (vec_ro, vec_ri, sizeof (fd_set));
126
+ memcpy (vec_wo, vec_wi, sizeof (fd_set));
127
+ #else
128
+ memcpy (vec_ro, vec_ri, vec_max * NFDBYTES);
129
+ memcpy (vec_wo, vec_wi, vec_max * NFDBYTES);
130
+ #endif
131
+
132
+ tv.tv_sec = (long)timeout;
133
+ tv.tv_usec = (long)((timeout - (ev_tstamp)tv.tv_sec) * 1e6);
134
+
135
+ res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv);
136
+
137
+ if (expect_false (res < 0))
138
+ {
139
+ #if EV_SELECT_IS_WINSOCKET
140
+ errno = WSAGetLastError ();
141
+ #endif
142
+
143
+ if (errno == EBADF)
144
+ fd_ebadf (EV_A);
145
+ else if (errno == ENOMEM && !syserr_cb)
146
+ fd_enomem (EV_A);
147
+ else if (errno != EINTR)
148
+ syserr ("(libev) select");
149
+
150
+ return;
151
+ }
152
+
153
+ #if EV_SELECT_USE_FD_SET
154
+
155
+ {
156
+ int fd;
157
+
158
+ for (fd = 0; fd < anfdmax; ++fd)
159
+ if (anfds [fd].events)
160
+ {
161
+ int events = 0;
162
+ #if EV_SELECT_IS_WINSOCKET
163
+ SOCKET handle = anfds [fd].handle;
164
+ #else
165
+ int handle = fd;
166
+ #endif
167
+
168
+ if (FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ;
169
+ if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE;
170
+
171
+ if (expect_true (events))
172
+ fd_event (EV_A_ fd, events);
173
+ }
174
+ }
175
+
176
+ #else
177
+
178
+ {
179
+ int word, bit;
180
+ for (word = vec_max; word--; )
181
+ {
182
+ fd_mask word_r = ((fd_mask *)vec_ro) [word];
183
+ fd_mask word_w = ((fd_mask *)vec_wo) [word];
184
+
185
+ if (word_r || word_w)
186
+ for (bit = NFDBITS; bit--; )
187
+ {
188
+ fd_mask mask = 1UL << bit;
189
+ int events = 0;
190
+
191
+ events |= word_r & mask ? EV_READ : 0;
192
+ events |= word_w & mask ? EV_WRITE : 0;
193
+
194
+ if (expect_true (events))
195
+ fd_event (EV_A_ word * NFDBITS + bit, events);
196
+ }
197
+ }
198
+ }
199
+
200
+ #endif
201
+ }
202
+
203
+ int inline_size
204
+ select_init (EV_P_ int flags)
205
+ {
206
+ backend_fudge = 0.; /* posix says this is zero */
207
+ backend_modify = select_modify;
208
+ backend_poll = select_poll;
209
+
210
+ #if EV_SELECT_USE_FD_SET
211
+ vec_max = FD_SETSIZE / 32;
212
+ vec_ri = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_ri);
213
+ vec_ro = ev_malloc (sizeof (fd_set));
214
+ vec_wi = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi);
215
+ vec_wo = ev_malloc (sizeof (fd_set));
216
+ #else
217
+ vec_max = 0;
218
+ vec_ri = 0;
219
+ vec_ri = 0;
220
+ vec_wo = 0;
221
+ vec_wo = 0;
222
+ #endif
223
+
224
+ return EVBACKEND_SELECT;
225
+ }
226
+
227
+ void inline_size
228
+ select_destroy (EV_P)
229
+ {
230
+ ev_free (vec_ri);
231
+ ev_free (vec_ro);
232
+ ev_free (vec_wi);
233
+ ev_free (vec_wo);
234
+ }
235
+
236
+
@@ -0,0 +1,108 @@
1
+ #define VARx(type,name) VAR(name, type name)
2
+
3
+ VARx(ev_tstamp, now_floor) /* last time we refreshed rt_time */
4
+ VARx(ev_tstamp, mn_now) /* monotonic clock "now" */
5
+ VARx(ev_tstamp, rtmn_diff) /* difference realtime - monotonic time */
6
+
7
+ VARx(ev_tstamp, io_blocktime)
8
+ VARx(ev_tstamp, timeout_blocktime)
9
+
10
+ VARx(int, backend)
11
+ VARx(int, activecnt) /* total number of active events ("refcount") */
12
+ VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */
13
+
14
+ VARx(int, backend_fd)
15
+ VARx(ev_tstamp, backend_fudge) /* assumed typical timer resolution */
16
+ VAR (backend_modify, void (*backend_modify)(EV_P_ int fd, int oev, int nev))
17
+ VAR (backend_poll , void (*backend_poll)(EV_P_ ev_tstamp timeout))
18
+
19
+ #if !defined(_WIN32) || EV_GENWRAP
20
+ VARx(pid_t, curpid)
21
+ #endif
22
+
23
+ VARx(int, postfork) /* true if we need to recreate kernel state after fork */
24
+
25
+ #if EV_USE_SELECT || EV_GENWRAP
26
+ VARx(void *, vec_ri)
27
+ VARx(void *, vec_ro)
28
+ VARx(void *, vec_wi)
29
+ VARx(void *, vec_wo)
30
+ VARx(int, vec_max)
31
+ #endif
32
+
33
+ #if EV_USE_POLL || EV_GENWRAP
34
+ VARx(struct pollfd *, polls)
35
+ VARx(int, pollmax)
36
+ VARx(int, pollcnt)
37
+ VARx(int *, pollidxs) /* maps fds into structure indices */
38
+ VARx(int, pollidxmax)
39
+ #endif
40
+
41
+ #if EV_USE_EPOLL || EV_GENWRAP
42
+ VARx(struct epoll_event *, epoll_events)
43
+ VARx(int, epoll_eventmax)
44
+ #endif
45
+
46
+ #if EV_USE_KQUEUE || EV_GENWRAP
47
+ VARx(struct kevent *, kqueue_changes)
48
+ VARx(int, kqueue_changemax)
49
+ VARx(int, kqueue_changecnt)
50
+ VARx(struct kevent *, kqueue_events)
51
+ VARx(int, kqueue_eventmax)
52
+ #endif
53
+
54
+ #if EV_USE_PORT || EV_GENWRAP
55
+ VARx(struct port_event *, port_events)
56
+ VARx(int, port_eventmax)
57
+ #endif
58
+
59
+ VARx(ANFD *, anfds)
60
+ VARx(int, anfdmax)
61
+
62
+ VAR (pendings, ANPENDING *pendings [NUMPRI])
63
+ VAR (pendingmax, int pendingmax [NUMPRI])
64
+ VAR (pendingcnt, int pendingcnt [NUMPRI])
65
+
66
+ VARx(int *, fdchanges)
67
+ VARx(int, fdchangemax)
68
+ VARx(int, fdchangecnt)
69
+
70
+ VARx(WT *, timers)
71
+ VARx(int, timermax)
72
+ VARx(int, timercnt)
73
+
74
+ #if EV_PERIODIC_ENABLE || EV_GENWRAP
75
+ VARx(WT *, periodics)
76
+ VARx(int, periodicmax)
77
+ VARx(int, periodiccnt)
78
+ #endif
79
+
80
+ #if EV_IDLE_ENABLE || EV_GENWRAP
81
+ VAR (idles, ev_idle **idles [NUMPRI])
82
+ VAR (idlemax, int idlemax [NUMPRI])
83
+ VAR (idlecnt, int idlecnt [NUMPRI])
84
+ #endif
85
+ VARx(int, idleall) /* total number */
86
+
87
+ VARx(struct ev_prepare **, prepares)
88
+ VARx(int, preparemax)
89
+ VARx(int, preparecnt)
90
+
91
+ VARx(struct ev_check **, checks)
92
+ VARx(int, checkmax)
93
+ VARx(int, checkcnt)
94
+
95
+ #if EV_FORK_ENABLE || EV_GENWRAP
96
+ VARx(struct ev_fork **, forks)
97
+ VARx(int, forkmax)
98
+ VARx(int, forkcnt)
99
+ #endif
100
+
101
+ #if EV_USE_INOTIFY || EV_GENWRAP
102
+ VARx(int, fs_fd)
103
+ VARx(ev_io, fs_w)
104
+ VAR (fs_hash, ANFS fs_hash [EV_INOTIFY_HASHSIZE])
105
+ #endif
106
+
107
+ #undef VARx
108
+