ebb 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/libev/ev_port.c ADDED
@@ -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
+
data/libev/ev_select.c ADDED
@@ -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
+
data/libev/ev_vars.h ADDED
@@ -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
+