Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib/ioloop-kqueue.c @ 9658:8ba4253adc9b HEAD tip
*-login: SSL connections didn't get closed when the client got destroyed.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 08 May 2014 16:41:29 +0300 |
parents | 86c28d14ddeb |
children |
rev | line source |
---|---|
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* |
3781
d996a407aa4b
Fix IO_ERROR behaviour. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3749
diff
changeset
|
2 * BSD kqueue() based ioloop handler. |
3749
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 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "lib.h" |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #ifdef IOLOOP_KQUEUE |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
4573
8d977716f449
Rewrote much of the kqueue code. It didn't work correctly if there were both
Timo Sirainen <tss@iki.fi>
parents:
4309
diff
changeset
|
11 #include "array.h" |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
12 #include "fd-close-on-exec.h" |
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
13 #include "ioloop-internal.h" |
4573
8d977716f449
Rewrote much of the kqueue code. It didn't work correctly if there were both
Timo Sirainen <tss@iki.fi>
parents:
4309
diff
changeset
|
14 |
3781
d996a407aa4b
Fix IO_ERROR behaviour. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3749
diff
changeset
|
15 #include <unistd.h> |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
16 #include <fcntl.h> |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #include <sys/types.h> |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include <sys/event.h> |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 #include <sys/time.h> |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
4737
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
21 /* kevent.udata's type just has to be different in NetBSD than in |
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
22 FreeBSD and OpenBSD.. */ |
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
23 #ifdef __NetBSD__ |
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
24 # define MY_EV_SET(a, b, c, d, e, f, g) \ |
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
25 EV_SET(a, b, c, d, e, f, (intptr_t)g) |
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
26 #else |
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
27 # define MY_EV_SET(a, b, c, d, e, f, g) \ |
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
28 EV_SET(a, b, c, d, e, f, g) |
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
29 #endif |
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
30 |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 struct ioloop_handler_context { |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
32 int kq; |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
4573
8d977716f449
Rewrote much of the kqueue code. It didn't work correctly if there were both
Timo Sirainen <tss@iki.fi>
parents:
4309
diff
changeset
|
34 unsigned int deleted_count; |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
35 ARRAY_DEFINE(events, struct kevent); |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 }; |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
8634
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
38 void io_loop_handler_init(struct ioloop *ioloop, unsigned int initial_fd_count) |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 { |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
40 struct ioloop_handler_context *ctx; |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
42 ioloop->handler_context = ctx = i_new(struct ioloop_handler_context, 1); |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
43 ctx->kq = kqueue(); |
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
44 if (ctx->kq < 0) |
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
45 i_fatal("kqueue() in io_loop_handler_init() failed: %m"); |
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
46 fd_close_on_exec(ctx->kq, TRUE); |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
8634
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
48 i_array_init(&ctx->events, initial_fd_count); |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 void io_loop_handler_deinit(struct ioloop *ioloop) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 { |
3781
d996a407aa4b
Fix IO_ERROR behaviour. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3749
diff
changeset
|
53 if (close(ioloop->handler_context->kq) < 0) |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
54 i_error("close(kqueue) in io_loop_handler_deinit() failed: %m"); |
4573
8d977716f449
Rewrote much of the kqueue code. It didn't work correctly if there were both
Timo Sirainen <tss@iki.fi>
parents:
4309
diff
changeset
|
55 array_free(&ioloop->handler_context->events); |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
56 i_free(ioloop->handler_context); |
3749
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 |
8366
2c111b572eee
Don't break if io_remove() or timeout_remove() are called for non-active ioloops.
Timo Sirainen <tss@iki.fi>
parents:
8100
diff
changeset
|
59 void io_loop_handle_add(struct io_file *io) |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 { |
8366
2c111b572eee
Don't break if io_remove() or timeout_remove() are called for non-active ioloops.
Timo Sirainen <tss@iki.fi>
parents:
8100
diff
changeset
|
61 struct ioloop_handler_context *ctx = io->io.ioloop->handler_context; |
4573
8d977716f449
Rewrote much of the kqueue code. It didn't work correctly if there were both
Timo Sirainen <tss@iki.fi>
parents:
4309
diff
changeset
|
62 struct kevent ev; |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
64 if ((io->io.condition & (IO_READ | IO_ERROR)) != 0) { |
4737
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
65 MY_EV_SET(&ev, io->fd, EVFILT_READ, EV_ADD, 0, 0, io); |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
66 if (kevent(ctx->kq, &ev, 1, NULL, 0, NULL) < 0) |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
67 i_fatal("kevent(EV_ADD, %d) failed: %m", io->fd); |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
68 } |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
69 if ((io->io.condition & IO_WRITE) != 0) { |
4737
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
70 MY_EV_SET(&ev, io->fd, EVFILT_WRITE, EV_ADD, 0, 0, io); |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
71 if (kevent(ctx->kq, &ev, 1, NULL, 0, NULL) < 0) |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
72 i_fatal("kevent(EV_ADD, %d) failed: %m", io->fd); |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
73 } |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
75 /* allow kevent() to return the maximum number of events |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
76 by keeping space allocated for each handle */ |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
77 if (ctx->deleted_count > 0) |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
78 ctx->deleted_count--; |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
79 else |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
80 (void)array_append_space(&ctx->events); |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 |
8366
2c111b572eee
Don't break if io_remove() or timeout_remove() are called for non-active ioloops.
Timo Sirainen <tss@iki.fi>
parents:
8100
diff
changeset
|
83 void io_loop_handle_remove(struct io_file *io, bool closed) |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 { |
8366
2c111b572eee
Don't break if io_remove() or timeout_remove() are called for non-active ioloops.
Timo Sirainen <tss@iki.fi>
parents:
8100
diff
changeset
|
85 struct ioloop_handler_context *ctx = io->io.ioloop->handler_context; |
4573
8d977716f449
Rewrote much of the kqueue code. It didn't work correctly if there were both
Timo Sirainen <tss@iki.fi>
parents:
4309
diff
changeset
|
86 struct kevent ev; |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
8100 | 88 if ((io->io.condition & (IO_READ | IO_ERROR)) != 0 && !closed) { |
4737
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
89 MY_EV_SET(&ev, io->fd, EVFILT_READ, EV_DELETE, 0, 0, NULL); |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
90 if (kevent(ctx->kq, &ev, 1, NULL, 0, NULL) < 0) |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
91 i_error("kevent(EV_DELETE, %d) failed: %m", io->fd); |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
92 } |
8100 | 93 if ((io->io.condition & IO_WRITE) != 0 && !closed) { |
4737
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
94 MY_EV_SET(&ev, io->fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
95 if (kevent(ctx->kq, &ev, 1, NULL, 0, NULL) < 0) |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
96 i_error("kevent(EV_DELETE, %d) failed: %m", io->fd); |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
97 } |
4573
8d977716f449
Rewrote much of the kqueue code. It didn't work correctly if there were both
Timo Sirainen <tss@iki.fi>
parents:
4309
diff
changeset
|
98 |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
99 /* since we're not freeing memory in any case, just increase |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
100 deleted counter so next handle_add() can just decrease it |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
101 insteading of appending to the events array */ |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
102 ctx->deleted_count++; |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
103 |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
104 i_assert(io->refcount > 0); |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
105 if (--io->refcount == 0) |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
106 i_free(io); |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 } |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 void io_loop_handler_run(struct ioloop *ioloop) |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 { |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
111 struct ioloop_handler_context *ctx = ioloop->handler_context; |
4576 | 112 struct kevent *events; |
113 const struct kevent *event; | |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
114 struct timeval tv; |
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
115 struct timespec ts; |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
116 struct io_file *io; |
4573
8d977716f449
Rewrote much of the kqueue code. It didn't work correctly if there were both
Timo Sirainen <tss@iki.fi>
parents:
4309
diff
changeset
|
117 unsigned int events_count, t_id; |
7153
4ecc97c9ce12
Ignore io_loop_get_wait_time() return value, we don't need it.
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
118 int ret, i; |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
120 /* get the time left for next timeout task */ |
7153
4ecc97c9ce12
Ignore io_loop_get_wait_time() return value, we don't need it.
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
121 io_loop_get_wait_time(ioloop, &tv, NULL); |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
122 ts.tv_sec = tv.tv_sec; |
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
123 ts.tv_nsec = tv.tv_usec * 1000; |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
125 /* wait for events */ |
4863
d13324a8e242
s/array_get_modifyable/array_get_modifiable/
Timo Sirainen <tss@iki.fi>
parents:
4737
diff
changeset
|
126 events = array_get_modifiable(&ctx->events, &events_count); |
4576 | 127 ret = kevent (ctx->kq, NULL, 0, events, events_count, &ts); |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
128 if (ret < 0 && errno != EINTR) |
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
129 i_fatal("kevent(): %m"); |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
131 /* reference all IOs */ |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
132 for (i = 0; i < ret; i++) { |
4737
fd0d7e9e0e72
Removed compiler warnings with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
133 io = (void *)events[i].udata; |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
134 io->refcount++; |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
135 } |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
136 |
4580
4644b3038b9a
Reference IOs before calling timeout handlers, in case they call
Timo Sirainen <tss@iki.fi>
parents:
4579
diff
changeset
|
137 /* execute timeout handlers */ |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
5682
diff
changeset
|
138 io_loop_handle_timeouts(ioloop); |
4580
4644b3038b9a
Reference IOs before calling timeout handlers, in case they call
Timo Sirainen <tss@iki.fi>
parents:
4579
diff
changeset
|
139 |
4576 | 140 for (i = 0; i < ret; i++) { |
141 /* io_loop_handle_add() may cause events array reallocation, | |
142 so we have use array_idx() */ | |
143 event = array_idx(&ctx->events, i); | |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
144 io = (void *)event->udata; |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
146 /* callback is NULL if io_remove() was already called */ |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
147 if (io->io.callback != NULL) { |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
148 t_id = t_push(); |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
149 io->io.callback(io->io.context); |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
150 if (t_pop() != t_id) { |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
151 i_panic("Leaked a t_pop() call in " |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
152 "I/O handler %p", |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
153 (void *)io->io.callback); |
3749
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 } |
4573
8d977716f449
Rewrote much of the kqueue code. It didn't work correctly if there were both
Timo Sirainen <tss@iki.fi>
parents:
4309
diff
changeset
|
155 } |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
156 |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
157 i_assert(io->refcount > 0); |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4577
diff
changeset
|
158 if (--io->refcount == 0) |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
4863
diff
changeset
|
159 i_free(io); |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3781
diff
changeset
|
160 } |
3749
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 |
194295062e5e
Added kqueue support. Patch by Vaclav Haisman.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 #endif |