13 #if (NGX_TEST_BUILD_EVENTPORT)
15 #define ushort_t u_short
18 #ifndef CLOCK_REALTIME
19 #define CLOCK_REALTIME 0
20 typedef int clockid_t;
21 typedef void * timer_t;
26 #define PORT_SOURCE_AIO 1
27 #define PORT_SOURCE_TIMER 2
28 #define PORT_SOURCE_USER 3
29 #define PORT_SOURCE_FD 4
30 #define PORT_SOURCE_ALERT 5
31 #define PORT_SOURCE_MQ 6
41 ushort_t portev_source;
43 uintptr_t portev_object;
47 typedef struct port_notify {
52 #if (__FreeBSD_version < 700005)
54 typedef struct itimerspec {
55 struct timespec it_interval;
56 struct timespec it_value;
61 int port_create(
void);
69 int port_associate(
int port,
int source, uintptr_t
object,
int events,
72 int port_associate(
int port,
int source, uintptr_t
object,
int events,
79 int port_dissociate(
int port,
int source, uintptr_t
object);
81 int port_dissociate(
int port,
int source, uintptr_t
object)
87 int port_getn(
int port, port_event_t list[], uint_t max, uint_t *nget,
88 struct timespec *timeout);
90 int port_getn(
int port, port_event_t list[], uint_t max, uint_t *nget,
91 struct timespec *timeout)
97 int timer_create(clockid_t clock_id,
struct sigevent *evp, timer_t *timerid);
99 int timer_create(clockid_t clock_id,
struct sigevent *evp, timer_t *timerid)
105 int timer_settime(timer_t timerid,
int flags,
const struct itimerspec *value,
106 struct itimerspec *ovalue);
108 int timer_settime(timer_t timerid,
int flags,
const struct itimerspec *value,
109 struct itimerspec *ovalue)
115 int timer_delete(timer_t timerid);
117 int timer_delete(timer_t timerid)
131 static void ngx_eventport_done(
ngx_cycle_t *cycle);
139 static void *ngx_eventport_create_conf(
ngx_cycle_t *cycle);
140 static char *ngx_eventport_init_conf(
ngx_cycle_t *cycle,
void *conf);
143 static port_event_t *event_list;
145 static timer_t event_timer = (timer_t) -1;
165 ngx_eventport_create_conf,
166 ngx_eventport_init_conf,
169 ngx_eventport_add_event,
170 ngx_eventport_del_event,
171 ngx_eventport_add_event,
172 ngx_eventport_del_event,
176 ngx_eventport_process_events,
186 ngx_eventport_commands,
203 struct itimerspec its;
214 "port_create() failed");
219 if (nevents < epcf->events) {
224 event_list =
ngx_alloc(
sizeof(port_event_t) * epcf->events,
226 if (event_list == NULL) {
235 pn.portnfy_port = ep;
238 sev.sigev_notify = SIGEV_PORT;
239 #if !(NGX_TEST_BUILD_EVENTPORT)
240 sev.sigev_value.sival_ptr = &pn;
243 if (timer_create(CLOCK_REALTIME, &sev, &event_timer) == -1) {
245 "timer_create() failed");
249 its.it_interval.tv_sec = timer / 1000;
250 its.it_interval.tv_nsec = (timer % 1000) * 1000000;
251 its.it_value.tv_sec = timer / 1000;
252 its.it_value.tv_nsec = (timer % 1000) * 1000000;
254 if (timer_settime(event_timer, 0, &its, NULL) == -1) {
256 "timer_settime() failed");
263 nevents = epcf->events;
276 if (event_timer != (timer_t) -1) {
277 if (timer_delete(event_timer) == -1) {
279 "timer_delete() failed");
282 event_timer = (timer_t) -1;
285 if (close(ep) == -1) {
287 "close() event port failed");
313 #if (NGX_READ_EVENT != POLLIN)
320 #if (NGX_WRITE_EVENT != POLLOUT)
330 "eventport add event: fd:%d ev:%04Xi", c->
fd, events);
332 if (port_associate(ep, PORT_SOURCE_FD, c->
fd, events,
333 (
void *) ((uintptr_t) ev | ev->
instance))
337 "port_associate() failed");
379 "eventport change event: fd:%d ev:%04Xi", c->
fd, event);
381 if (port_associate(ep, PORT_SOURCE_FD, c->
fd, event,
382 (
void *) ((uintptr_t) ev | ev->
instance))
386 "port_associate() failed");
392 "eventport del event: fd:%d", c->
fd);
394 if (port_dissociate(ep, PORT_SOURCE_FD, c->
fd) == -1) {
396 "port_dissociate() failed");
419 struct timespec ts, *tp;
425 ts.tv_sec = timer / 1000;
426 ts.tv_nsec = (timer % 1000) * 1000000;
431 "eventport timer: %M", timer);
435 n = port_getn(ep, event_list, (u_int) nevents, &events, tp);
450 "port_getn() returned no events without timeout");
465 "port_getn() returned no events without timeout");
471 for (i = 0; i < events; i++) {
473 if (event_list[i].portev_source == PORT_SOURCE_TIMER) {
478 ev = event_list[
i].portev_user;
480 switch (event_list[i].portev_source) {
484 instance = (uintptr_t) ev & 1;
485 ev = (
ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);
495 "eventport: stale event %p", ev);
499 revents = event_list[
i].portev_events;
502 "eventport: fd:%d, ev:%04Xd",
503 event_list[i].portev_object, revents);
505 if (revents & (POLLERR|POLLHUP|POLLNVAL)) {
507 "port_getn() error fd:%d ev:%04Xd",
508 event_list[i].portev_object, revents);
511 if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {
513 "strange port_getn() events fd:%d ev:%04Xd",
514 event_list[i].portev_object, revents);
517 if ((revents & (POLLERR|POLLHUP|POLLNVAL))
518 && (revents & (POLLIN|POLLOUT)) == 0)
526 revents |= POLLIN|POLLOUT;
536 if (revents & POLLIN) {
565 if (port_associate(ep, PORT_SOURCE_FD, c->
fd, POLLIN,
566 (
void *) ((uintptr_t) ev | ev->
instance))
570 "port_associate() failed");
576 if (revents & POLLOUT) {
578 if (flags & NGX_POST_THREAD_EVENTS) {
585 if (flags & NGX_POST_EVENTS) {
597 "unexpected even_port object %d",
598 event_list[i].portev_object);
626 ngx_eventport_init_conf(
ngx_cycle_t *cycle,
void *conf)