Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib/ioloop-kqueue.c @ 3749:194295062e5e HEAD
Added kqueue support. Patch by Vaclav Haisman.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 14 Dec 2005 20:51:52 +0200 |
parents | |
children | d996a407aa4b |
rev | line source |
---|---|
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 * FreeBSD kqueue() based ioloop handler. |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 * |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 * Copyright (c) 2005 Vaclav Haisman <v.haisman@sh.cvut.cz> |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 * |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 * This library is free software; you can redistribute it and/or modify |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 * it under the terms of the GNU Lesser General Public License as published |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 * by the Free Software Foundation; either version 2 of the License, or |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 * (at your option) any later version. |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 */ |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 /* @UNSAFE: whole file */ |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "lib.h" |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "ioloop-internal.h" |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #ifdef IOLOOP_KQUEUE |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 #include <sys/types.h> |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 #include <sys/event.h> |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 #include <sys/time.h> |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 #ifndef INITIAL_BUF_SIZE |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 # define INITIAL_BUF_SIZE 128 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 #endif |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct ioloop_handler_context { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 int kq; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 size_t evbuf_size; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 struct kevent *evbuf; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 size_t fds_size; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 struct fdrecord *fds; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 }; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 struct fdrecord { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 struct io *errio; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 enum io_condition mode; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 }; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 void io_loop_handler_init(struct ioloop *ioloop) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 struct ioloop_handler_context *ctx; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 ioloop->handler_context = ctx = |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 p_new(ioloop->pool, struct ioloop_handler_context, 1); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 ctx->evbuf_size = INITIAL_BUF_SIZE; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 ctx->evbuf = p_new(ioloop->pool, struct kevent, ctx->evbuf_size); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 ctx->kq = kqueue(); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 if (ctx->kq < 0) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 i_fatal("kqueue(): %m"); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 ctx->fds_size = INITIAL_BUF_SIZE; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 ctx->fds = p_new(ioloop->pool, struct fdrecord, ctx->fds_size); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 void io_loop_handler_deinit(struct ioloop *ioloop) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 p_free(ioloop->pool, ioloop->handler_context->evbuf); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 p_free(ioloop->pool, ioloop->handler_context->fds); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 p_free(ioloop->pool, ioloop->handler_context); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 void io_loop_handle_add(struct ioloop *ioloop, struct io *io) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 struct ioloop_handler_context *ctx = ioloop->handler_context; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 const int fd = io->fd; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 struct kevent ev = {fd, 0, EV_ADD | EV_CLEAR | EV_EOF, 0, 0, NULL}; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 enum io_condition condition = io->condition; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 /* grow ctx->fds array if necessary */ |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 if ((size_t)fd >= ctx->fds_size) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 size_t old_size = ctx->fds_size; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 ctx->fds_size = nearest_power((unsigned int)fd+1); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 i_assert(ctx->fds_size < (size_t)-1 / sizeof(int)); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 ctx->fds = p_realloc(ioloop->pool, ctx->fds, |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 sizeof(struct fdrecord) * old_size, |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 sizeof(struct fdrecord) * ctx->fds_size); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 memset(ctx->fds + old_size, 0, |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 sizeof(struct fdrecord) * (ctx->fds_size - old_size)); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 if (condition & (IO_READ | IO_WRITE)) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 ev.udata = io; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 if (condition & IO_ERROR) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 ctx->fds[fd].errio = io; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 if (condition & (IO_READ | IO_ERROR)) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 ctx->fds[fd].mode |= condition; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 ev.filter = EVFILT_READ; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 kevent(ctx->kq, &ev, 1, NULL, 0, NULL); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 if (condition & (IO_WRITE | IO_ERROR)) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 ctx->fds[fd].mode |= condition; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 ev.filter = EVFILT_WRITE; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 kevent(ctx->kq, &ev, 1, NULL, 0, NULL); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 void io_loop_handle_remove(struct ioloop *ioloop, struct io *io) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 struct ioloop_handler_context *ctx = ioloop->handler_context; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 struct kevent ev = { fd, 0, EV_DELETE, 0, 0, NULL }; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 struct fdrecord *const fds = ctx->fds; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 const int fd = io->fd; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 const enum io_condition condition = io->condition; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 i_assert((size_t)fd < ctx->fds_size); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 i_assert(fds[fd].mode != 0); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 if (condition & IO_ERROR) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 fds[fd].errio = NULL; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 if (condition & (IO_READ | IO_ERROR)) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 ev.filter = EVFILT_READ; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 fds[fd].mode &= ~condition; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 if ((fds[fd].mode & (IO_READ | IO_ERROR)) == 0) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 kevent(ctx->kq, &ev, 1, NULL, 0, NULL); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 if (condition & (IO_WRITE | IO_ERROR)) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 ev.filter = EVFILT_WRITE; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 fds[fd].mode &= ~condition; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 if ((fds[fd].mode & (IO_WRITE | IO_ERROR)) == 0) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 kevent(ctx->kq, &ev, 1, NULL, 0, NULL); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 void io_loop_handler_run(struct ioloop *ioloop) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 struct ioloop_handler_context *ctx = ioloop->handler_context; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 struct timeval tv; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 struct timespec ts; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 unsigned int t_id; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 int msecs, ret, i; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 /* get the time left for next timeout task */ |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 msecs = io_loop_get_wait_time(ioloop->timeouts, &tv, NULL); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 ts.tv_sec = tv.tv_sec; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 ts.tv_nsec = tv.tv_usec * 1000; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 /* wait for events */ |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 ret = kevent (ctx->kq, NULL, 0, ctx->evbuf, ctx->evbuf_size, &ts); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 if (ret < 0 && errno != EINTR) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 i_fatal("kevent(): %m"); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 /* execute timeout handlers */ |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 io_loop_handle_timeouts(ioloop); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 if (ret <= 0 || !ioloop->running) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 /* no I/O events */ |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 return; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 i_assert((size_t)ret <= ctx->evbuf_size); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 /* loop through all received events */ |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 for (i = 0; i < ret; ++i) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 struct io *io = ctx->evbuf[i].udata; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 i_assert(ctx->evbuf[i].ident < ctx->fds_size); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 if (ctx->fds[ctx->evbuf[i].ident].mode & IO_ERROR) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 struct io *errio = ctx->fds[ctx->evbuf[i].ident].errio; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 t_id = t_push(); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 errio->callback(errio->context); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 if (t_pop() != t_id) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 i_panic("Leaked a t_pop() call" |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 " in I/O handler %p", |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 (void *)errio->callback); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 if (ctx->fds[ctx->evbuf[i].ident].mode & (IO_WRITE | IO_READ)) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 t_id = t_push(); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 io->callback(io->context); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 if (t_pop() != t_id) { |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 i_panic("Leaked a t_pop() call" |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 " in I/O handler %p", |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 (void *)io->callback); |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 #endif |