Mercurial > dovecot > core-2.2
annotate src/lib/ioloop.c @ 22664:fea53c2725c0
director: Fix director_max_parallel_moves/kicks type
Should be uint, not time.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 09 Nov 2017 12:24:16 +0200 |
parents | bcc3a15c18a6 |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2002-2017 Dovecot authors, see the included COPYING file */ |
0 | 2 |
3 #include "lib.h" | |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
4 #include "array.h" |
22512
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
5 #include "backtrace-string.h" |
21106
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
6 #include "llist.h" |
9769
8716936443db
Moved all struct timeval comparing/calculation code to lib/time-util.
Timo Sirainen <tss@iki.fi>
parents:
9494
diff
changeset
|
7 #include "time-util.h" |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
8 #include "istream-private.h" |
13529
cf77e448295c
Renamed lib/*-internal.h files to lib/*-private.h for consistency.
Timo Sirainen <tss@iki.fi>
parents:
13509
diff
changeset
|
9 #include "ioloop-private.h" |
0 | 10 |
5222
685a2d213438
If time moves backwards only max. 5 seconds, sleep instead of killing
Timo Sirainen <tss@iki.fi>
parents:
5204
diff
changeset
|
11 #include <unistd.h> |
685a2d213438
If time moves backwards only max. 5 seconds, sleep instead of killing
Timo Sirainen <tss@iki.fi>
parents:
5204
diff
changeset
|
12 |
4102
99b17f13cc1e
Timers weren't called always properly when they should have.
Timo Sirainen <tss@iki.fi>
parents:
3987
diff
changeset
|
13 #define timer_is_larger(tvp, uvp) \ |
0 | 14 ((tvp)->tv_sec > (uvp)->tv_sec || \ |
15 ((tvp)->tv_sec == (uvp)->tv_sec && \ | |
16 (tvp)->tv_usec > (uvp)->tv_usec)) | |
17 | |
404
f25e575bf1ca
Created datastack_mempool which is used by at least a few temporary
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
18 time_t ioloop_time = 0; |
0 | 19 struct timeval ioloop_timeval; |
20949
efe8424307ff
lib: Added ioloop_global_wait_usecs
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20942
diff
changeset
|
20 struct ioloop *current_ioloop = NULL; |
efe8424307ff
lib: Added ioloop_global_wait_usecs
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20942
diff
changeset
|
21 uint64_t ioloop_global_wait_usecs = 0; |
0 | 22 |
16969
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
23 static ARRAY(io_switch_callback_t *) io_switch_callbacks = ARRAY_INIT; |
0 | 24 |
8634
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
25 static void io_loop_initialize_handler(struct ioloop *ioloop) |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
26 { |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
27 unsigned int initial_fd_count; |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
28 |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
29 initial_fd_count = ioloop->max_fd_count > 0 && |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
30 ioloop->max_fd_count < IOLOOP_INITIAL_FD_COUNT ? |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
31 ioloop->max_fd_count : IOLOOP_INITIAL_FD_COUNT; |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
32 io_loop_handler_init(ioloop, initial_fd_count); |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
33 } |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
34 |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
35 static struct io_file * |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
36 io_add_file(int fd, enum io_condition condition, |
20811 | 37 const char *source_filename, |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
38 unsigned int source_linenum, |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
39 io_callback_t *callback, void *context) |
0 | 40 { |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
41 struct io_file *io; |
0 | 42 |
953
411006be3c66
Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
43 i_assert(callback != NULL); |
3534
a9be1824403b
New inotify code and notify API change. Patch by Johannes Berg
Timo Sirainen <tss@iki.fi>
parents:
3527
diff
changeset
|
44 i_assert((condition & IO_NOTIFY) == 0); |
1729
5bf22d6bb65e
Added IO_DIR_NOTIFY and IO_FILE_NOTIFY conditions to io_add(). IO_DIR_NOTIFY
Timo Sirainen <tss@iki.fi>
parents:
1502
diff
changeset
|
45 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
46 io = i_new(struct io_file, 1); |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
47 io->io.condition = condition; |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
48 io->io.callback = callback; |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
49 io->io.context = context; |
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
|
50 io->io.ioloop = current_ioloop; |
20811 | 51 io->io.source_filename = source_filename; |
14045
0308a33d9f99
ioloop: I/O and timeout leak messages now include the io_add()/timeout_add() source line number.
Timo Sirainen <tss@iki.fi>
parents:
13579
diff
changeset
|
52 io->io.source_linenum = source_linenum; |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4102
diff
changeset
|
53 io->refcount = 1; |
0 | 54 io->fd = fd; |
55 | |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
56 if (io->io.ioloop->cur_ctx != NULL) { |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
57 io->io.ctx = io->io.ioloop->cur_ctx; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
58 io_loop_context_ref(io->io.ctx); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
59 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
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 if (io->io.ioloop->handler_context == NULL) |
8634
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
62 io_loop_initialize_handler(io->io.ioloop); |
17720
7985461cf21c
io_add_istream(): Allow the istream to be added even if it doesn't have fd.
Timo Sirainen <tss@iki.fi>
parents:
17635
diff
changeset
|
63 if (fd != -1) |
7985461cf21c
io_add_istream(): Allow the istream to be added even if it doesn't have fd.
Timo Sirainen <tss@iki.fi>
parents:
17635
diff
changeset
|
64 io_loop_handle_add(io); |
7985461cf21c
io_add_istream(): Allow the istream to be added even if it doesn't have fd.
Timo Sirainen <tss@iki.fi>
parents:
17635
diff
changeset
|
65 else { |
7985461cf21c
io_add_istream(): Allow the istream to be added even if it doesn't have fd.
Timo Sirainen <tss@iki.fi>
parents:
17635
diff
changeset
|
66 /* we're adding an istream whose only way to get notified |
7985461cf21c
io_add_istream(): Allow the istream to be added even if it doesn't have fd.
Timo Sirainen <tss@iki.fi>
parents:
17635
diff
changeset
|
67 is to call i_stream_set_input_pending() */ |
7985461cf21c
io_add_istream(): Allow the istream to be added even if it doesn't have fd.
Timo Sirainen <tss@iki.fi>
parents:
17635
diff
changeset
|
68 } |
0 | 69 |
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
|
70 if (io->io.ioloop->io_files != NULL) { |
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
|
71 io->io.ioloop->io_files->prev = io; |
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
|
72 io->next = io->io.ioloop->io_files; |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
73 } |
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
|
74 io->io.ioloop->io_files = io; |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
75 return io; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
76 } |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
77 |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
78 #undef io_add |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
79 struct io *io_add(int fd, enum io_condition condition, |
20811 | 80 const char *source_filename, |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
81 unsigned int source_linenum, |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
82 io_callback_t *callback, void *context) |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
83 { |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
84 struct io_file *io; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
85 |
17720
7985461cf21c
io_add_istream(): Allow the istream to be added even if it doesn't have fd.
Timo Sirainen <tss@iki.fi>
parents:
17635
diff
changeset
|
86 i_assert(fd >= 0); |
20811 | 87 io = io_add_file(fd, condition, source_filename, source_linenum, callback, context); |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
88 return &io->io; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
89 } |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
90 |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
91 #undef io_add_istream |
20811 | 92 struct io *io_add_istream(struct istream *input, const char *source_filename, |
93 unsigned int source_linenum, | |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
94 io_callback_t *callback, void *context) |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
95 { |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
96 struct io_file *io; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
97 |
20811 | 98 io = io_add_file(i_stream_get_fd(input), IO_READ, source_filename, |
99 source_linenum, callback, context); | |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
100 io->istream = input; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
101 i_stream_ref(io->istream); |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
102 i_stream_set_io(io->istream, &io->io); |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
103 return &io->io; |
0 | 104 } |
105 | |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
106 static void io_file_unlink(struct io_file *io) |
3534
a9be1824403b
New inotify code and notify API change. Patch by Johannes Berg
Timo Sirainen <tss@iki.fi>
parents:
3527
diff
changeset
|
107 { |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
108 if (io->prev != NULL) |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
109 io->prev->next = io->next; |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
110 else |
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
|
111 io->io.ioloop->io_files = io->next; |
3959
ef5595d6ddec
Cleanups: Make io_remove() do the linked list updating also for notify
Timo Sirainen <tss@iki.fi>
parents:
3958
diff
changeset
|
112 |
ef5595d6ddec
Cleanups: Make io_remove() do the linked list updating also for notify
Timo Sirainen <tss@iki.fi>
parents:
3958
diff
changeset
|
113 if (io->next != NULL) |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
114 io->next->prev = io->prev; |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
115 |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
116 /* if we got here from an I/O handler callback, make sure we |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
117 don't try to handle this one next. */ |
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
|
118 if (io->io.ioloop->next_io_file == io) |
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
|
119 io->io.ioloop->next_io_file = io->next; |
3534
a9be1824403b
New inotify code and notify API change. Patch by Johannes Berg
Timo Sirainen <tss@iki.fi>
parents:
3527
diff
changeset
|
120 } |
a9be1824403b
New inotify code and notify API change. Patch by Johannes Berg
Timo Sirainen <tss@iki.fi>
parents:
3527
diff
changeset
|
121 |
8100 | 122 static void io_remove_full(struct io **_io, bool closed) |
0 | 123 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
124 struct io *io = *_io; |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
125 |
6587 | 126 i_assert(io->callback != NULL); |
127 | |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
128 *_io = NULL; |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
129 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
130 /* make sure the callback doesn't get called anymore. |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
131 kqueue code relies on this. */ |
4579
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4102
diff
changeset
|
132 io->callback = NULL; |
40b353def38c
OK, so the original kqueue code wasn't actually broken, but it could have
Timo Sirainen <tss@iki.fi>
parents:
4102
diff
changeset
|
133 |
17187
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
134 if (io->pending) { |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
135 i_assert(io->ioloop->io_pending_count > 0); |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
136 io->ioloop->io_pending_count--; |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
137 } |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
138 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
139 if (io->ctx != NULL) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
140 io_loop_context_unref(&io->ctx); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
141 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
142 if ((io->condition & IO_NOTIFY) != 0) |
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
|
143 io_loop_notify_remove(io); |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
144 else { |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
145 struct io_file *io_file = (struct io_file *)io; |
18039
1632ae08c986
lib: io_remove() should finish closing the io before unreferencing its istream.
Timo Sirainen <tss@iki.fi>
parents:
17878
diff
changeset
|
146 struct istream *istream = io_file->istream; |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
147 |
19906
e47ace66bc42
lib: Fixed memory leak io_add_istream()+io_remove() when the stream didn't have fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
148 if (istream != NULL) { |
e47ace66bc42
lib: Fixed memory leak io_add_istream()+io_remove() when the stream didn't have fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
149 /* remove io before it's freed */ |
e47ace66bc42
lib: Fixed memory leak io_add_istream()+io_remove() when the stream didn't have fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
150 i_stream_unset_io(istream, io); |
e47ace66bc42
lib: Fixed memory leak io_add_istream()+io_remove() when the stream didn't have fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
151 } |
e47ace66bc42
lib: Fixed memory leak io_add_istream()+io_remove() when the stream didn't have fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
152 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
153 io_file_unlink(io_file); |
17720
7985461cf21c
io_add_istream(): Allow the istream to be added even if it doesn't have fd.
Timo Sirainen <tss@iki.fi>
parents:
17635
diff
changeset
|
154 if (io_file->fd != -1) |
7985461cf21c
io_add_istream(): Allow the istream to be added even if it doesn't have fd.
Timo Sirainen <tss@iki.fi>
parents:
17635
diff
changeset
|
155 io_loop_handle_remove(io_file, closed); |
19906
e47ace66bc42
lib: Fixed memory leak io_add_istream()+io_remove() when the stream didn't have fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
156 else |
e47ace66bc42
lib: Fixed memory leak io_add_istream()+io_remove() when the stream didn't have fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
157 i_free(io); |
18039
1632ae08c986
lib: io_remove() should finish closing the io before unreferencing its istream.
Timo Sirainen <tss@iki.fi>
parents:
17878
diff
changeset
|
158 |
1632ae08c986
lib: io_remove() should finish closing the io before unreferencing its istream.
Timo Sirainen <tss@iki.fi>
parents:
17878
diff
changeset
|
159 /* remove io from the ioloop before unreferencing the istream, |
1632ae08c986
lib: io_remove() should finish closing the io before unreferencing its istream.
Timo Sirainen <tss@iki.fi>
parents:
17878
diff
changeset
|
160 because a destroyed istream may automatically close the |
1632ae08c986
lib: io_remove() should finish closing the io before unreferencing its istream.
Timo Sirainen <tss@iki.fi>
parents:
17878
diff
changeset
|
161 fd. */ |
19906
e47ace66bc42
lib: Fixed memory leak io_add_istream()+io_remove() when the stream didn't have fd.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
162 if (istream != NULL) |
18039
1632ae08c986
lib: io_remove() should finish closing the io before unreferencing its istream.
Timo Sirainen <tss@iki.fi>
parents:
17878
diff
changeset
|
163 i_stream_unref(&istream); |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
164 } |
0 | 165 } |
166 | |
8100 | 167 void io_remove(struct io **io) |
168 { | |
169 io_remove_full(io, FALSE); | |
170 } | |
171 | |
172 void io_remove_closed(struct io **io) | |
173 { | |
174 i_assert(((*io)->condition & IO_NOTIFY) == 0); | |
175 | |
176 io_remove_full(io, TRUE); | |
177 } | |
178 | |
17187
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
179 void io_set_pending(struct io *io) |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
180 { |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
181 i_assert((io->condition & IO_NOTIFY) == 0); |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
182 |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
183 if (!io->pending) { |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
184 io->pending = TRUE; |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
185 io->ioloop->io_pending_count++; |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
186 } |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
187 } |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
188 |
1171
6a22587f069a
Don't inline timeout_update_next(). gcc 3.2.2 with -O2 seems to break it.
Timo Sirainen <tss@iki.fi>
parents:
1036
diff
changeset
|
189 static void timeout_update_next(struct timeout *timeout, struct timeval *tv_now) |
0 | 190 { |
1203 | 191 if (tv_now == NULL) { |
192 if (gettimeofday(&timeout->next_run, NULL) < 0) | |
193 i_fatal("gettimeofday(): %m"); | |
194 } else { | |
0 | 195 timeout->next_run.tv_sec = tv_now->tv_sec; |
196 timeout->next_run.tv_usec = tv_now->tv_usec; | |
197 } | |
198 | |
199 /* we don't want microsecond accuracy or this function will be | |
200 called all the time - millisecond is more than enough */ | |
1171
6a22587f069a
Don't inline timeout_update_next(). gcc 3.2.2 with -O2 seems to break it.
Timo Sirainen <tss@iki.fi>
parents:
1036
diff
changeset
|
201 timeout->next_run.tv_usec -= timeout->next_run.tv_usec % 1000; |
0 | 202 |
203 timeout->next_run.tv_sec += timeout->msecs/1000; | |
204 timeout->next_run.tv_usec += (timeout->msecs%1000)*1000; | |
205 | |
206 if (timeout->next_run.tv_usec > 1000000) { | |
207 timeout->next_run.tv_sec++; | |
208 timeout->next_run.tv_usec -= 1000000; | |
209 } | |
210 } | |
211 | |
17853
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
212 static struct timeout * |
20811 | 213 timeout_add_common(const char *source_filename, unsigned int source_linenum, |
14045
0308a33d9f99
ioloop: I/O and timeout leak messages now include the io_add()/timeout_add() source line number.
Timo Sirainen <tss@iki.fi>
parents:
13579
diff
changeset
|
214 timeout_callback_t *callback, void *context) |
0 | 215 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
899
diff
changeset
|
216 struct timeout *timeout; |
0 | 217 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
218 timeout = i_new(struct timeout, 1); |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
219 timeout->item.idx = UINT_MAX; |
20811 | 220 timeout->source_filename = source_filename; |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
221 timeout->source_linenum = source_linenum; |
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
|
222 timeout->ioloop = current_ioloop; |
0 | 223 |
953
411006be3c66
Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
224 timeout->callback = callback; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
225 timeout->context = context; |
0 | 226 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
227 if (timeout->ioloop->cur_ctx != NULL) { |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
228 timeout->ctx = timeout->ioloop->cur_ctx; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
229 io_loop_context_ref(timeout->ctx); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
230 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
231 |
17853
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
232 return timeout; |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
233 } |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
234 |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
235 #undef timeout_add |
20811 | 236 struct timeout *timeout_add(unsigned int msecs, const char *source_filename, |
237 unsigned int source_linenum, | |
17853
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
238 timeout_callback_t *callback, void *context) |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
239 { |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
240 struct timeout *timeout; |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
241 |
20811 | 242 timeout = timeout_add_common(source_filename, source_linenum, callback, context); |
17853
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
243 timeout->msecs = msecs; |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
244 |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
245 if (msecs > 0) { |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
246 /* start this timeout in the next run cycle */ |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
247 array_append(&timeout->ioloop->timeouts_new, &timeout, 1); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
248 } else { |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
249 /* trigger zero timeouts as soon as possible */ |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
250 timeout_update_next(timeout, timeout->ioloop->running ? |
404
f25e575bf1ca
Created datastack_mempool which is used by at least a few temporary
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
251 NULL : &ioloop_timeval); |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
252 priorityq_add(timeout->ioloop->timeouts, &timeout->item); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
253 } |
0 | 254 return timeout; |
255 } | |
256 | |
14577
a47c95872745
Use timeout_add_short() for sub-second timeouts. Fail at compile time if timeout_add() is <1s.
Timo Sirainen <tss@iki.fi>
parents:
14473
diff
changeset
|
257 #undef timeout_add_short |
a47c95872745
Use timeout_add_short() for sub-second timeouts. Fail at compile time if timeout_add() is <1s.
Timo Sirainen <tss@iki.fi>
parents:
14473
diff
changeset
|
258 struct timeout * |
20811 | 259 timeout_add_short(unsigned int msecs, const char *source_filename, |
260 unsigned int source_linenum, | |
14577
a47c95872745
Use timeout_add_short() for sub-second timeouts. Fail at compile time if timeout_add() is <1s.
Timo Sirainen <tss@iki.fi>
parents:
14473
diff
changeset
|
261 timeout_callback_t *callback, void *context) |
a47c95872745
Use timeout_add_short() for sub-second timeouts. Fail at compile time if timeout_add() is <1s.
Timo Sirainen <tss@iki.fi>
parents:
14473
diff
changeset
|
262 { |
20811 | 263 return timeout_add(msecs, source_filename, source_linenum, callback, context); |
14577
a47c95872745
Use timeout_add_short() for sub-second timeouts. Fail at compile time if timeout_add() is <1s.
Timo Sirainen <tss@iki.fi>
parents:
14473
diff
changeset
|
264 } |
a47c95872745
Use timeout_add_short() for sub-second timeouts. Fail at compile time if timeout_add() is <1s.
Timo Sirainen <tss@iki.fi>
parents:
14473
diff
changeset
|
265 |
17853
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
266 #undef timeout_add_absolute |
17856
df53b5ccc2ba
lib: Fixed earlier timeout_add_absolute() commit.
Timo Sirainen <tss@iki.fi>
parents:
17853
diff
changeset
|
267 struct timeout * |
df53b5ccc2ba
lib: Fixed earlier timeout_add_absolute() commit.
Timo Sirainen <tss@iki.fi>
parents:
17853
diff
changeset
|
268 timeout_add_absolute(const struct timeval *time, |
20811 | 269 const char *source_filename, |
17856
df53b5ccc2ba
lib: Fixed earlier timeout_add_absolute() commit.
Timo Sirainen <tss@iki.fi>
parents:
17853
diff
changeset
|
270 unsigned int source_linenum, |
df53b5ccc2ba
lib: Fixed earlier timeout_add_absolute() commit.
Timo Sirainen <tss@iki.fi>
parents:
17853
diff
changeset
|
271 timeout_callback_t *callback, void *context) |
17853
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
272 { |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
273 struct timeout *timeout; |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
274 |
20811 | 275 timeout = timeout_add_common(source_filename, source_linenum, |
276 callback, context); | |
17853
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
277 timeout->one_shot = TRUE; |
17856
df53b5ccc2ba
lib: Fixed earlier timeout_add_absolute() commit.
Timo Sirainen <tss@iki.fi>
parents:
17853
diff
changeset
|
278 timeout->next_run = *time; |
17853
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
279 |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
280 priorityq_add(timeout->ioloop->timeouts, &timeout->item); |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
281 return timeout; |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
282 } |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
283 |
17878
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
284 static struct timeout * |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
285 timeout_copy(const struct timeout *old_to) |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
286 { |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
287 struct timeout *new_to; |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
288 |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
289 new_to = timeout_add_common |
20811 | 290 (old_to->source_filename, old_to->source_linenum, |
291 old_to->callback, old_to->context); | |
17878
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
292 new_to->one_shot = old_to->one_shot; |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
293 new_to->msecs = old_to->msecs; |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
294 new_to->next_run = old_to->next_run; |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
295 |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
296 if (old_to->item.idx != UINT_MAX) |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
297 priorityq_add(new_to->ioloop->timeouts, &new_to->item); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
298 else if (!new_to->one_shot) { |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
299 i_assert(new_to->msecs > 0); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
300 array_append(&new_to->ioloop->timeouts_new, &new_to, 1); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
301 } |
17878
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
302 |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
303 return new_to; |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
304 } |
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
305 |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
306 static void timeout_free(struct timeout *timeout) |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
307 { |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
308 if (timeout->ctx != NULL) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
309 io_loop_context_unref(&timeout->ctx); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
310 i_free(timeout); |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
311 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
312 |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
313 void timeout_remove(struct timeout **_timeout) |
0 | 314 { |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
315 struct timeout *timeout = *_timeout; |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
316 struct ioloop *ioloop = timeout->ioloop; |
0 | 317 |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
318 *_timeout = NULL; |
17877
9ce4d8d394cc
lib: ioloop: Fixed absolute timeout removal.
Stephan Bosch <stephan@rename-it.nl>
parents:
17856
diff
changeset
|
319 if (timeout->item.idx != UINT_MAX) |
9ce4d8d394cc
lib: ioloop: Fixed absolute timeout removal.
Stephan Bosch <stephan@rename-it.nl>
parents:
17856
diff
changeset
|
320 priorityq_remove(timeout->ioloop->timeouts, &timeout->item); |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
321 else if (!timeout->one_shot && timeout->msecs > 0) { |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
322 struct timeout *const *to_idx; |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
323 array_foreach(&ioloop->timeouts_new, to_idx) { |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
324 if (*to_idx == timeout) { |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
325 array_delete(&ioloop->timeouts_new, |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
326 array_foreach_idx(&ioloop->timeouts_new, to_idx), 1); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
327 break; |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
328 } |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
329 } |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
330 } |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
331 timeout_free(timeout); |
0 | 332 } |
333 | |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14577
diff
changeset
|
334 static void ATTR_NULL(2) |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
335 timeout_reset_timeval(struct timeout *timeout, struct timeval *tv_now) |
0 | 336 { |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
337 if (timeout->item.idx == UINT_MAX) |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
338 return; |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
339 |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
340 timeout_update_next(timeout, tv_now); |
15987
2bbec4dadcb6
timeout_add_short(1) may have caused infinite looping.
Timo Sirainen <tss@iki.fi>
parents:
15973
diff
changeset
|
341 if (timeout->msecs <= 1) { |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
342 /* if we came here from io_loop_handle_timeouts(), |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
343 next_run must be larger than tv_now or we could go to |
8504
2297a352dfd3
ioloop: 0 ms timeouts could still have caused infinite looping.
Timo Sirainen <tss@iki.fi>
parents:
8503
diff
changeset
|
344 infinite loop. +1000 to get 1 ms further, another +1000 to |
2297a352dfd3
ioloop: 0 ms timeouts could still have caused infinite looping.
Timo Sirainen <tss@iki.fi>
parents:
8503
diff
changeset
|
345 account for timeout_update_next()'s truncation. */ |
2297a352dfd3
ioloop: 0 ms timeouts could still have caused infinite looping.
Timo Sirainen <tss@iki.fi>
parents:
8503
diff
changeset
|
346 timeout->next_run.tv_usec += 2000; |
7537
d432ef4835e3
timeout_add(0, ..) was looping in timeout handling code.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
347 if (timeout->next_run.tv_usec >= 1000000) { |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
348 timeout->next_run.tv_sec++; |
7537
d432ef4835e3
timeout_add(0, ..) was looping in timeout handling code.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
349 timeout->next_run.tv_usec -= 1000000; |
d432ef4835e3
timeout_add(0, ..) was looping in timeout handling code.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
350 } |
1475
474e4b205af7
If there were no timeouts, struct timeval wasn't initialized and select()
Timo Sirainen <tss@iki.fi>
parents:
1351
diff
changeset
|
351 } |
7537
d432ef4835e3
timeout_add(0, ..) was looping in timeout handling code.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
352 i_assert(tv_now == NULL || |
d432ef4835e3
timeout_add(0, ..) was looping in timeout handling code.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
353 timeout->next_run.tv_sec > tv_now->tv_sec || |
d432ef4835e3
timeout_add(0, ..) was looping in timeout handling code.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
354 (timeout->next_run.tv_sec == tv_now->tv_sec && |
d432ef4835e3
timeout_add(0, ..) was looping in timeout handling code.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
355 timeout->next_run.tv_usec > tv_now->tv_usec)); |
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
|
356 priorityq_remove(timeout->ioloop->timeouts, &timeout->item); |
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
|
357 priorityq_add(timeout->ioloop->timeouts, &timeout->item); |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
358 } |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
359 |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
360 void timeout_reset(struct timeout *timeout) |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
361 { |
17877
9ce4d8d394cc
lib: ioloop: Fixed absolute timeout removal.
Stephan Bosch <stephan@rename-it.nl>
parents:
17856
diff
changeset
|
362 i_assert(!timeout->one_shot); |
14473
266521d59e2c
timeout_reset(): Don't use cached ioloop_timeval.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
363 timeout_reset_timeval(timeout, NULL); |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
364 } |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
365 |
7152
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
366 static int timeout_get_wait_time(struct timeout *timeout, struct timeval *tv_r, |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
367 struct timeval *tv_now) |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
368 { |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
369 int ret; |
0 | 370 |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
371 if (tv_now->tv_sec == 0) { |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
372 if (gettimeofday(tv_now, NULL) < 0) |
1203 | 373 i_fatal("gettimeofday(): %m"); |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
374 } |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
375 tv_r->tv_sec = tv_now->tv_sec; |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
376 tv_r->tv_usec = tv_now->tv_usec; |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
377 |
8503
16ca1b36e6c3
Avoid integer overflows when calculating with very large timeout values.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
378 i_assert(tv_r->tv_sec > 0); |
16ca1b36e6c3
Avoid integer overflows when calculating with very large timeout values.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
379 i_assert(timeout->next_run.tv_sec > 0); |
0 | 380 |
7152
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
381 tv_r->tv_sec = timeout->next_run.tv_sec - tv_r->tv_sec; |
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
382 tv_r->tv_usec = timeout->next_run.tv_usec - tv_r->tv_usec; |
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
383 if (tv_r->tv_usec < 0) { |
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
384 tv_r->tv_sec--; |
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
385 tv_r->tv_usec += 1000000; |
0 | 386 } |
387 | |
8503
16ca1b36e6c3
Avoid integer overflows when calculating with very large timeout values.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
388 if (tv_r->tv_sec < 0 || (tv_r->tv_sec == 0 && tv_r->tv_usec < 1000)) { |
7152
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
389 tv_r->tv_sec = 0; |
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
390 tv_r->tv_usec = 0; |
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
391 return 0; |
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
392 } |
8503
16ca1b36e6c3
Avoid integer overflows when calculating with very large timeout values.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
393 if (tv_r->tv_sec > INT_MAX/1000-1) |
16ca1b36e6c3
Avoid integer overflows when calculating with very large timeout values.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
394 tv_r->tv_sec = INT_MAX/1000-1; |
16ca1b36e6c3
Avoid integer overflows when calculating with very large timeout values.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
395 |
16ca1b36e6c3
Avoid integer overflows when calculating with very large timeout values.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
396 /* round wait times up to next millisecond */ |
16ca1b36e6c3
Avoid integer overflows when calculating with very large timeout values.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
397 ret = tv_r->tv_sec * 1000 + (tv_r->tv_usec + 999) / 1000; |
16ca1b36e6c3
Avoid integer overflows when calculating with very large timeout values.
Timo Sirainen <tss@iki.fi>
parents:
8366
diff
changeset
|
398 i_assert(ret > 0 && tv_r->tv_sec >= 0 && tv_r->tv_usec >= 0); |
7152
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
399 return ret; |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
400 } |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
401 |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
402 int io_loop_get_wait_time(struct ioloop *ioloop, struct timeval *tv_r) |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
403 { |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
404 struct timeval tv_now; |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
405 struct priorityq_item *item; |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
406 struct timeout *timeout; |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
407 int msecs; |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
408 |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
409 item = priorityq_peek(ioloop->timeouts); |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
410 timeout = (struct timeout *)item; |
20770
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
411 |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
412 /* we need to see if there are pending IO waiting, |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
413 if there is, we set msecs = 0 to ensure they are |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
414 processed without delay */ |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
415 if (timeout == NULL && ioloop->io_pending_count == 0) { |
12713
16ce45dbcb53
ioloop: Use -1 for infinite poll/epoll timeout rather than INT_MAX.
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
416 /* no timeouts. use INT_MAX msecs for timeval and |
16ce45dbcb53
ioloop: Use -1 for infinite poll/epoll timeout rather than INT_MAX.
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
417 return -1 for poll/epoll infinity. */ |
7152
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
418 tv_r->tv_sec = INT_MAX / 1000; |
3e506d46655f
timeout_get_wait_time() may have returned negative seconds in timeval. Also
Timo Sirainen <tss@iki.fi>
parents:
7098
diff
changeset
|
419 tv_r->tv_usec = 0; |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
420 ioloop->next_max_time = (1ULL << (TIME_T_MAX_BITS-1)) - 1; |
12713
16ce45dbcb53
ioloop: Use -1 for infinite poll/epoll timeout rather than INT_MAX.
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
421 return -1; |
5328
239ccb49852c
If timeout wait time was less than 1 millisecond, we wasted CPU calling
Timo Sirainen <tss@iki.fi>
parents:
5248
diff
changeset
|
422 } |
0 | 423 |
20770
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
424 if (ioloop->io_pending_count > 0) { |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
425 if (gettimeofday(&tv_now, NULL) < 0) |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
426 i_fatal("gettimeofday(): %m"); |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
427 msecs = 0; |
20942
d8169b055abe
lib: Ensure tv_r gets set in io_loop_get_wait_time
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20811
diff
changeset
|
428 tv_r->tv_sec = 0; |
d8169b055abe
lib: Ensure tv_r gets set in io_loop_get_wait_time
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20811
diff
changeset
|
429 tv_r->tv_usec = 0; |
20770
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
430 } else { |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
431 tv_now.tv_sec = 0; |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
432 msecs = timeout_get_wait_time(timeout, tv_r, &tv_now); |
e5d797361253
lib: Update ioloop attributes
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20754
diff
changeset
|
433 } |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
434 ioloop->next_max_time = (tv_now.tv_sec + msecs/1000) + 1; |
19160
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
435 |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
436 /* update ioloop_timeval - this is meant for io_loop_handle_timeouts()'s |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
437 ioloop_wait_usecs calculation. normally after this we go to the |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
438 ioloop and after that we update ioloop_timeval immediately again. */ |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
439 ioloop_timeval = tv_now; |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
440 ioloop_time = tv_now.tv_sec; |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
441 return msecs; |
0 | 442 } |
443 | |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
444 static int timeout_cmp(const void *p1, const void *p2) |
0 | 445 { |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
446 const struct timeout *to1 = p1, *to2 = p2; |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
447 |
9769
8716936443db
Moved all struct timeval comparing/calculation code to lib/time-util.
Timo Sirainen <tss@iki.fi>
parents:
9494
diff
changeset
|
448 return timeval_cmp(&to1->next_run, &to2->next_run); |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
449 } |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
450 |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
451 static void io_loop_default_time_moved(time_t old_time, time_t new_time) |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
452 { |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
453 if (old_time > new_time) { |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
454 i_warning("Time moved backwards by %ld seconds.", |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
455 (long)(old_time - new_time)); |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
456 } |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
457 } |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
458 |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
459 static void io_loop_timeouts_start_new(struct ioloop *ioloop) |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
460 { |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
461 struct timeout *const *to_idx; |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
462 |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
463 if (array_count(&ioloop->timeouts_new) == 0) |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
464 return; |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
465 |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
466 io_loop_time_refresh(); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
467 |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
468 array_foreach(&ioloop->timeouts_new, to_idx) { |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
469 struct timeout *timeout= *to_idx; |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
470 i_assert(timeout->next_run.tv_sec == 0 && |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
471 timeout->next_run.tv_usec == 0); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
472 i_assert(!timeout->one_shot); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
473 i_assert(timeout->msecs > 0); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
474 timeout_update_next(timeout, &ioloop_timeval); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
475 priorityq_add(ioloop->timeouts, &timeout->item); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
476 } |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
477 array_clear(&ioloop->timeouts_new); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
478 } |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
479 |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
480 static void io_loop_timeouts_update(struct ioloop *ioloop, long diff_secs) |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
481 { |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
482 struct priorityq_item *const *items; |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
483 unsigned int i, count; |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
484 |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
485 count = priorityq_count(ioloop->timeouts); |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
486 items = priorityq_items(ioloop->timeouts); |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
487 for (i = 0; i < count; i++) { |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
488 struct timeout *to = (struct timeout *)items[i]; |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
489 |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
490 to->next_run.tv_sec += diff_secs; |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
491 } |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
492 } |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
493 |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
494 static void io_loops_timeouts_update(long diff_secs) |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
495 { |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
496 struct ioloop *ioloop; |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
497 |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
498 for (ioloop = current_ioloop; ioloop != NULL; ioloop = ioloop->prev) |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
499 io_loop_timeouts_update(ioloop, diff_secs); |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
500 } |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
501 |
21105
6c47609c4831
lib: Code cleanup - move code to ioloop_add_wait_time()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21104
diff
changeset
|
502 static void ioloop_add_wait_time(struct ioloop *ioloop) |
6c47609c4831
lib: Code cleanup - move code to ioloop_add_wait_time()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21104
diff
changeset
|
503 { |
21106
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
504 struct io_wait_timer *timer; |
21105
6c47609c4831
lib: Code cleanup - move code to ioloop_add_wait_time()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21104
diff
changeset
|
505 long long diff = |
6c47609c4831
lib: Code cleanup - move code to ioloop_add_wait_time()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21104
diff
changeset
|
506 timeval_diff_usecs(&ioloop_timeval, &ioloop->wait_started); |
6c47609c4831
lib: Code cleanup - move code to ioloop_add_wait_time()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21104
diff
changeset
|
507 ioloop->ioloop_wait_usecs += diff; |
6c47609c4831
lib: Code cleanup - move code to ioloop_add_wait_time()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21104
diff
changeset
|
508 ioloop_global_wait_usecs += diff; |
21106
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
509 |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
510 for (timer = ioloop->wait_timers; timer != NULL; timer = timer->next) |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
511 timer->usecs += diff; |
21105
6c47609c4831
lib: Code cleanup - move code to ioloop_add_wait_time()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21104
diff
changeset
|
512 } |
6c47609c4831
lib: Code cleanup - move code to ioloop_add_wait_time()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21104
diff
changeset
|
513 |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
514 static void io_loop_handle_timeouts_real(struct ioloop *ioloop) |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
515 { |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
516 struct priorityq_item *item; |
21104
ae1d3bdf3cca
lib: Fix ioloop wait times when io_loop_time_refresh() is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20949
diff
changeset
|
517 struct timeval tv, tv_call; |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
518 unsigned int t_id; |
0 | 519 |
9400
b59c6c30115e
Removed ioloop_timezone. It's not working nowadays.
Timo Sirainen <tss@iki.fi>
parents:
8634
diff
changeset
|
520 if (gettimeofday(&ioloop_timeval, NULL) < 0) |
1203 | 521 i_fatal("gettimeofday(): %m"); |
5204
c0d7aeedea81
If time moves backwards, kill ourself.
Timo Sirainen <tss@iki.fi>
parents:
5139
diff
changeset
|
522 |
5222
685a2d213438
If time moves backwards only max. 5 seconds, sleep instead of killing
Timo Sirainen <tss@iki.fi>
parents:
5204
diff
changeset
|
523 /* Don't bother comparing usecs. */ |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
524 if (unlikely(ioloop_time > ioloop_timeval.tv_sec)) { |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
525 /* time moved backwards */ |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
526 io_loops_timeouts_update(-(long)(ioloop_time - |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
527 ioloop_timeval.tv_sec)); |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
528 ioloop->time_moved_callback(ioloop_time, |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
529 ioloop_timeval.tv_sec); |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
530 /* the callback may have slept, so check the time again. */ |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
531 if (gettimeofday(&ioloop_timeval, NULL) < 0) |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
532 i_fatal("gettimeofday(): %m"); |
19160
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
533 } else { |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
534 if (unlikely(ioloop_timeval.tv_sec > |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
535 ioloop->next_max_time)) { |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
536 io_loops_timeouts_update(ioloop_timeval.tv_sec - |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
537 ioloop->next_max_time); |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
538 /* time moved forwards */ |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
539 ioloop->time_moved_callback(ioloop->next_max_time, |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
540 ioloop_timeval.tv_sec); |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
541 } |
21105
6c47609c4831
lib: Code cleanup - move code to ioloop_add_wait_time()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21104
diff
changeset
|
542 ioloop_add_wait_time(ioloop); |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
543 } |
5222
685a2d213438
If time moves backwards only max. 5 seconds, sleep instead of killing
Timo Sirainen <tss@iki.fi>
parents:
5204
diff
changeset
|
544 |
0 | 545 ioloop_time = ioloop_timeval.tv_sec; |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
546 tv_call = ioloop_timeval; |
0 | 547 |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
548 while ((item = priorityq_peek(ioloop->timeouts)) != NULL) { |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
549 struct timeout *timeout = (struct timeout *)item; |
4102
99b17f13cc1e
Timers weren't called always properly when they should have.
Timo Sirainen <tss@iki.fi>
parents:
3987
diff
changeset
|
550 |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
551 /* use tv_call to make sure we don't get to infinite loop in |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
552 case callbacks update ioloop_timeval. */ |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
553 if (timeout_get_wait_time(timeout, &tv, &tv_call) > 0) |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
554 break; |
0 | 555 |
17877
9ce4d8d394cc
lib: ioloop: Fixed absolute timeout removal.
Stephan Bosch <stephan@rename-it.nl>
parents:
17856
diff
changeset
|
556 if (timeout->one_shot) { |
9ce4d8d394cc
lib: ioloop: Fixed absolute timeout removal.
Stephan Bosch <stephan@rename-it.nl>
parents:
17856
diff
changeset
|
557 /* remove timeout from queue */ |
9ce4d8d394cc
lib: ioloop: Fixed absolute timeout removal.
Stephan Bosch <stephan@rename-it.nl>
parents:
17856
diff
changeset
|
558 priorityq_remove(timeout->ioloop->timeouts, &timeout->item); |
9ce4d8d394cc
lib: ioloop: Fixed absolute timeout removal.
Stephan Bosch <stephan@rename-it.nl>
parents:
17856
diff
changeset
|
559 } else { |
17853
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
560 /* update timeout's next_run and reposition it in the queue */ |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
561 timeout_reset_timeval(timeout, &tv_call); |
d80395660f27
lib: Added support for setting timeouts at absolute time, rather than relative to current time.
Stephan Bosch <stephan@rename-it.nl>
parents:
17839
diff
changeset
|
562 } |
0 | 563 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
564 if (timeout->ctx != NULL) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
565 io_loop_context_activate(timeout->ctx); |
17635
6ea0584e3861
lib: add identifying markers to data-stack frames
Phil Carmody <phil@dovecot.fi>
parents:
17243
diff
changeset
|
566 t_id = t_push_named("ioloop timeout handler %p", |
6ea0584e3861
lib: add identifying markers to data-stack frames
Phil Carmody <phil@dovecot.fi>
parents:
17243
diff
changeset
|
567 (void *)timeout->callback); |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
568 timeout->callback(timeout->context); |
3527
56df153e9f65
If we leaked a t_pop() call, tell where it happened
Timo Sirainen <tss@iki.fi>
parents:
3482
diff
changeset
|
569 if (t_pop() != t_id) { |
56df153e9f65
If we leaked a t_pop() call, tell where it happened
Timo Sirainen <tss@iki.fi>
parents:
3482
diff
changeset
|
570 i_panic("Leaked a t_pop() call in timeout handler %p", |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
571 (void *)timeout->callback); |
3527
56df153e9f65
If we leaked a t_pop() call, tell where it happened
Timo Sirainen <tss@iki.fi>
parents:
3482
diff
changeset
|
572 } |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
573 if (ioloop->cur_ctx != NULL) |
14928 | 574 io_loop_context_deactivate(ioloop->cur_ctx); |
0 | 575 } |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
576 } |
4102
99b17f13cc1e
Timers weren't called always properly when they should have.
Timo Sirainen <tss@iki.fi>
parents:
3987
diff
changeset
|
577 |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
578 void io_loop_handle_timeouts(struct ioloop *ioloop) |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
579 { |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7154
diff
changeset
|
580 T_BEGIN { |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
581 io_loop_handle_timeouts_real(ioloop); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7154
diff
changeset
|
582 } T_END; |
0 | 583 } |
584 | |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
585 void io_loop_call_io(struct io *io) |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
586 { |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
587 struct ioloop *ioloop = io->ioloop; |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
588 unsigned int t_id; |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
589 |
17187
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
590 if (io->pending) { |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
591 i_assert(ioloop->io_pending_count > 0); |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
592 ioloop->io_pending_count--; |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
593 io->pending = FALSE; |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
594 } |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
595 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
596 if (io->ctx != NULL) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
597 io_loop_context_activate(io->ctx); |
17635
6ea0584e3861
lib: add identifying markers to data-stack frames
Phil Carmody <phil@dovecot.fi>
parents:
17243
diff
changeset
|
598 t_id = t_push_named("ioloop handler %p", |
6ea0584e3861
lib: add identifying markers to data-stack frames
Phil Carmody <phil@dovecot.fi>
parents:
17243
diff
changeset
|
599 (void *)io->callback); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
600 io->callback(io->context); |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
601 if (t_pop() != t_id) { |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
602 i_panic("Leaked a t_pop() call in I/O handler %p", |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
603 (void *)io->callback); |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
604 } |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
605 if (ioloop->cur_ctx != NULL) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
606 io_loop_context_deactivate(ioloop->cur_ctx); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
607 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
608 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
899
diff
changeset
|
609 void io_loop_run(struct ioloop *ioloop) |
0 | 610 { |
5939
8f1d94246a8f
Delay initializing ioloop backend until it's needed.
Timo Sirainen <tss@iki.fi>
parents:
5636
diff
changeset
|
611 if (ioloop->handler_context == NULL) |
8634
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
612 io_loop_initialize_handler(ioloop); |
5939
8f1d94246a8f
Delay initializing ioloop backend until it's needed.
Timo Sirainen <tss@iki.fi>
parents:
5636
diff
changeset
|
613 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
614 if (ioloop->cur_ctx != NULL) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
615 io_loop_context_unref(&ioloop->cur_ctx); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
616 |
16868
c82ac3b0474f
io_loop_run() now assert-crashes if it's attempted to be used recursively for the same ioloop.
Timo Sirainen <tss@iki.fi>
parents:
16303
diff
changeset
|
617 /* recursive io_loop_run() isn't allowed for the same ioloop. |
c82ac3b0474f
io_loop_run() now assert-crashes if it's attempted to be used recursively for the same ioloop.
Timo Sirainen <tss@iki.fi>
parents:
16303
diff
changeset
|
618 it can break backends. */ |
c82ac3b0474f
io_loop_run() now assert-crashes if it's attempted to be used recursively for the same ioloop.
Timo Sirainen <tss@iki.fi>
parents:
16303
diff
changeset
|
619 i_assert(!ioloop->iolooping); |
c82ac3b0474f
io_loop_run() now assert-crashes if it's attempted to be used recursively for the same ioloop.
Timo Sirainen <tss@iki.fi>
parents:
16303
diff
changeset
|
620 ioloop->iolooping = TRUE; |
c82ac3b0474f
io_loop_run() now assert-crashes if it's attempted to be used recursively for the same ioloop.
Timo Sirainen <tss@iki.fi>
parents:
16303
diff
changeset
|
621 |
5939
8f1d94246a8f
Delay initializing ioloop backend until it's needed.
Timo Sirainen <tss@iki.fi>
parents:
5636
diff
changeset
|
622 ioloop->running = TRUE; |
0 | 623 while (ioloop->running) |
624 io_loop_handler_run(ioloop); | |
16868
c82ac3b0474f
io_loop_run() now assert-crashes if it's attempted to be used recursively for the same ioloop.
Timo Sirainen <tss@iki.fi>
parents:
16303
diff
changeset
|
625 ioloop->iolooping = FALSE; |
0 | 626 } |
627 | |
17187
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
628 static void io_loop_call_pending(struct ioloop *ioloop) |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
629 { |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
630 struct io_file *io; |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
631 |
17243
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
632 while (ioloop->io_pending_count > 0) { |
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
633 io = ioloop->io_files; |
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
634 do { |
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
635 ioloop->next_io_file = io->next; |
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
636 if (io->io.pending) |
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
637 io_loop_call_io(&io->io); |
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
638 if (ioloop->io_pending_count == 0) |
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
639 break; |
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
640 io = ioloop->next_io_file; |
7540a5cdbdf1
ioloop: Fixed segfault crash in io_loop_call_pending().
Timo Sirainen <tss@iki.fi>
parents:
17188
diff
changeset
|
641 } while (io != NULL); |
17187
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
642 } |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
643 } |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
644 |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
645 void io_loop_handler_run(struct ioloop *ioloop) |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
646 { |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
647 io_loop_timeouts_start_new(ioloop); |
21104
ae1d3bdf3cca
lib: Fix ioloop wait times when io_loop_time_refresh() is used
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20949
diff
changeset
|
648 ioloop->wait_started = ioloop_timeval; |
17187
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
649 io_loop_handler_run_internal(ioloop); |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
650 io_loop_call_pending(ioloop); |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
651 } |
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
652 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
899
diff
changeset
|
653 void io_loop_stop(struct ioloop *ioloop) |
0 | 654 { |
655 ioloop->running = FALSE; | |
656 } | |
657 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
899
diff
changeset
|
658 void io_loop_set_running(struct ioloop *ioloop) |
0 | 659 { |
660 ioloop->running = TRUE; | |
661 } | |
662 | |
8634
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
663 void io_loop_set_max_fd_count(struct ioloop *ioloop, unsigned int max_fds) |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
664 { |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
665 ioloop->max_fd_count = max_fds; |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
666 } |
86c28d14ddeb
Added io_loop_set_max_fd_count() to specify how many fds we expect to use.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
667 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3798
diff
changeset
|
668 bool io_loop_is_running(struct ioloop *ioloop) |
1033 | 669 { |
670 return ioloop->running; | |
671 } | |
672 | |
13489
3334c12a2b1a
liblib: Added io_loop_time_refresh()
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
673 void io_loop_time_refresh(void) |
3334c12a2b1a
liblib: Added io_loop_time_refresh()
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
674 { |
3334c12a2b1a
liblib: Added io_loop_time_refresh()
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
675 if (gettimeofday(&ioloop_timeval, NULL) < 0) |
3334c12a2b1a
liblib: Added io_loop_time_refresh()
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
676 i_fatal("gettimeofday(): %m"); |
3334c12a2b1a
liblib: Added io_loop_time_refresh()
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
677 ioloop_time = ioloop_timeval.tv_sec; |
3334c12a2b1a
liblib: Added io_loop_time_refresh()
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
678 } |
3334c12a2b1a
liblib: Added io_loop_time_refresh()
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
679 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
680 struct ioloop *io_loop_create(void) |
0 | 681 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
899
diff
changeset
|
682 struct ioloop *ioloop; |
0 | 683 |
684 /* initialize time */ | |
9400
b59c6c30115e
Removed ioloop_timezone. It's not working nowadays.
Timo Sirainen <tss@iki.fi>
parents:
8634
diff
changeset
|
685 if (gettimeofday(&ioloop_timeval, NULL) < 0) |
1203 | 686 i_fatal("gettimeofday(): %m"); |
0 | 687 ioloop_time = ioloop_timeval.tv_sec; |
688 | |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
689 ioloop = i_new(struct ioloop, 1); |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
690 ioloop->timeouts = priorityq_init(timeout_cmp, 32); |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
691 i_array_init(&ioloop->timeouts_new, 8); |
0 | 692 |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
693 ioloop->time_moved_callback = current_ioloop != NULL ? |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
694 current_ioloop->time_moved_callback : |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
695 io_loop_default_time_moved; |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
696 |
0 | 697 ioloop->prev = current_ioloop; |
16964
b740824110f4
Use io_loop_set_current() instead of directly setting it.
Timo Sirainen <tss@iki.fi>
parents:
16868
diff
changeset
|
698 io_loop_set_current(ioloop); |
0 | 699 return ioloop; |
700 } | |
701 | |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
702 void io_loop_destroy(struct ioloop **_ioloop) |
0 | 703 { |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
704 struct ioloop *ioloop = *_ioloop; |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
705 struct timeout *const *to_idx; |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
706 struct priorityq_item *item; |
22512
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
707 bool leaks = FALSE; |
1351
6709d9330885
minor memory leak/cleanup fixes
Timo Sirainen <tss@iki.fi>
parents:
1203
diff
changeset
|
708 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
709 *_ioloop = NULL; |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
710 |
16969
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
711 /* ->prev won't work unless loops are destroyed in create order */ |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
712 i_assert(ioloop == current_ioloop); |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
713 io_loop_set_current(current_ioloop->prev); |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
714 |
5139
2d1f02635ccf
Delay initializing I/O notify backend until the first notify is added.
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
715 if (ioloop->notify_handler_context != NULL) |
2d1f02635ccf
Delay initializing I/O notify backend until the first notify is added.
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
716 io_loop_notify_handler_deinit(ioloop); |
3958
3e9b43d0cd80
kqueue updates. Patch by Vaclav Haisman
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
717 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
718 while (ioloop->io_files != NULL) { |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
719 struct io_file *io = ioloop->io_files; |
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
720 struct io *_io = &io->io; |
0 | 721 |
20811 | 722 i_warning("I/O leak: %p (%s:%u, fd %d)", |
14045
0308a33d9f99
ioloop: I/O and timeout leak messages now include the io_add()/timeout_add() source line number.
Timo Sirainen <tss@iki.fi>
parents:
13579
diff
changeset
|
723 (void *)io->io.callback, |
20811 | 724 io->io.source_filename, |
14045
0308a33d9f99
ioloop: I/O and timeout leak messages now include the io_add()/timeout_add() source line number.
Timo Sirainen <tss@iki.fi>
parents:
13579
diff
changeset
|
725 io->io.source_linenum, io->fd); |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
726 io_remove(&_io); |
22512
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
727 leaks = TRUE; |
0 | 728 } |
17187
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
729 i_assert(ioloop->io_pending_count == 0); |
0 | 730 |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
731 array_foreach(&ioloop->timeouts_new, to_idx) { |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
732 struct timeout *to = *to_idx; |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
733 |
20811 | 734 i_warning("Timeout leak: %p (%s:%u)", (void *)to->callback, |
735 to->source_filename, | |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
736 to->source_linenum); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
737 timeout_free(to); |
22512
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
738 leaks = TRUE; |
19025
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
739 } |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
740 array_free(&ioloop->timeouts_new); |
5423ae859f15
lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents:
19022
diff
changeset
|
741 |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
742 while ((item = priorityq_pop(ioloop->timeouts)) != NULL) { |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
743 struct timeout *to = (struct timeout *)item; |
0 | 744 |
20811 | 745 i_warning("Timeout leak: %p (%s:%u)", (void *)to->callback, |
746 to->source_filename, | |
14045
0308a33d9f99
ioloop: I/O and timeout leak messages now include the io_add()/timeout_add() source line number.
Timo Sirainen <tss@iki.fi>
parents:
13579
diff
changeset
|
747 to->source_linenum); |
12500
8fa2c23e9256
ioloop: Don't leak memory when detecting a leaked timeout.
Timo Sirainen <tss@iki.fi>
parents:
12499
diff
changeset
|
748 timeout_free(to); |
22512
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
749 leaks = TRUE; |
0 | 750 } |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
751 priorityq_deinit(&ioloop->timeouts); |
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
752 |
21106
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
753 while (ioloop->wait_timers != NULL) { |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
754 struct io_wait_timer *timer = ioloop->wait_timers; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
755 |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
756 i_warning("IO wait timer leak: %s:%u", |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
757 timer->source_filename, |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
758 timer->source_linenum); |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
759 io_wait_timer_remove(&timer); |
22512
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
760 leaks = TRUE; |
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
761 } |
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
762 |
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
763 if (leaks) { |
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
764 const char *backtrace; |
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
765 if (backtrace_get(&backtrace) == 0) |
bcc3a15c18a6
lib: When logging I/O or timeout leak, log also raw backtrace
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21451
diff
changeset
|
766 i_warning("Raw backtrace for leaks: %s", backtrace); |
21106
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
767 } |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
768 |
7098
becdf2eacdce
Use priority queue to implement timeout handling. Added timeout_reset().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
769 if (ioloop->handler_context != NULL) |
5939
8f1d94246a8f
Delay initializing ioloop backend until it's needed.
Timo Sirainen <tss@iki.fi>
parents:
5636
diff
changeset
|
770 io_loop_handler_deinit(ioloop); |
0 | 771 |
13579
f41a3dd03be2
ioloop: Memory leak fix on ioloop destroy.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
772 if (ioloop->cur_ctx != NULL) |
f41a3dd03be2
ioloop: Memory leak fix on ioloop destroy.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
773 io_loop_context_deactivate(ioloop->cur_ctx); |
f41a3dd03be2
ioloop: Memory leak fix on ioloop destroy.
Timo Sirainen <tss@iki.fi>
parents:
13529
diff
changeset
|
774 |
5248
12ac5f685814
Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents:
5242
diff
changeset
|
775 i_free(ioloop); |
0 | 776 } |
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
|
777 |
9494
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
778 void io_loop_set_time_moved_callback(struct ioloop *ioloop, |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
779 io_loop_time_moved_callback_t *callback) |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
780 { |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
781 ioloop->time_moved_callback = callback; |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
782 } |
a442d3c40693
ioloop: Added callback for handling time jumping forwards/backwards.
Timo Sirainen <tss@iki.fi>
parents:
9400
diff
changeset
|
783 |
16969
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
784 static void io_switch_callbacks_free(void) |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
785 { |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
786 array_free(&io_switch_callbacks); |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
787 } |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
788 |
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
|
789 void io_loop_set_current(struct ioloop *ioloop) |
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
|
790 { |
16969
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
791 io_switch_callback_t *const *callbackp; |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
792 struct ioloop *prev_ioloop = current_ioloop; |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
793 |
21451
ef07cc84cbb3
lib: io_loop_set_current() - do nothing if ioloop doesn't change
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
794 if (ioloop == current_ioloop) |
ef07cc84cbb3
lib: io_loop_set_current() - do nothing if ioloop doesn't change
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
795 return; |
ef07cc84cbb3
lib: io_loop_set_current() - do nothing if ioloop doesn't change
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
796 |
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
|
797 current_ioloop = ioloop; |
16969
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
798 if (array_is_created(&io_switch_callbacks)) { |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
799 array_foreach(&io_switch_callbacks, callbackp) |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
800 (*callbackp)(prev_ioloop); |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
801 } |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
802 } |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
803 |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
804 void io_loop_add_switch_callback(io_switch_callback_t *callback) |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
805 { |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
806 if (!array_is_created(&io_switch_callbacks)) { |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
807 i_array_init(&io_switch_callbacks, 4); |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
808 lib_atexit(io_switch_callbacks_free); |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
809 } |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
810 array_append(&io_switch_callbacks, &callback, 1); |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
811 } |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
812 |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
813 void io_loop_remove_switch_callback(io_switch_callback_t *callback) |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
814 { |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
815 io_switch_callback_t *const *callbackp; |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
816 unsigned int idx; |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
817 |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
818 array_foreach(&io_switch_callbacks, callbackp) { |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
819 if (*callbackp == callback) { |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
820 idx = array_foreach_idx(&io_switch_callbacks, callbackp); |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
821 array_delete(&io_switch_callbacks, idx, 1); |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
822 return; |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
823 } |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
824 } |
54eb87b7761c
Added io_loop_add/remove_switch_callback() to call a callback when ioloop is changed.
Timo Sirainen <tss@iki.fi>
parents:
16964
diff
changeset
|
825 i_unreached(); |
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
|
826 } |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
827 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
828 struct ioloop_context *io_loop_context_new(struct ioloop *ioloop) |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
829 { |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
830 struct ioloop_context *ctx; |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
831 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
832 ctx = i_new(struct ioloop_context, 1); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
833 ctx->refcount = 2; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
834 ctx->ioloop = ioloop; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
835 i_array_init(&ctx->callbacks, 4); |
12499 | 836 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
837 if (ioloop->cur_ctx != NULL) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
838 io_loop_context_unref(&ioloop->cur_ctx); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
839 ioloop->cur_ctx = ctx; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
840 return ctx; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
841 } |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
842 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
843 void io_loop_context_ref(struct ioloop_context *ctx) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
844 { |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
845 i_assert(ctx->refcount > 0); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
846 |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
847 ctx->refcount++; |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
848 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
849 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
850 void io_loop_context_unref(struct ioloop_context **_ctx) |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
851 { |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
852 struct ioloop_context *ctx = *_ctx; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
853 |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
854 *_ctx = NULL; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
855 |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
856 i_assert(ctx->refcount > 0); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
857 if (--ctx->refcount > 0) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
858 return; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
859 |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
860 /* cur_ctx itself keeps a reference */ |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
861 i_assert(ctx->ioloop->cur_ctx != ctx); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
862 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
863 array_free(&ctx->callbacks); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
864 i_free(ctx); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
865 } |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
866 |
17839
e588792b4f20
lib: Code cleanup - check io_loop_context_add/remove_callbacks() callback parameters.
Timo Sirainen <tss@iki.fi>
parents:
17720
diff
changeset
|
867 #undef io_loop_context_add_callbacks |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
868 void io_loop_context_add_callbacks(struct ioloop_context *ctx, |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
869 io_callback_t *activate, |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
870 io_callback_t *deactivate, void *context) |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
871 { |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
872 struct ioloop_context_callback cb; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
873 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21106
diff
changeset
|
874 i_zero(&cb); |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
875 cb.activate = activate; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
876 cb.deactivate = deactivate; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
877 cb.context = context; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
878 |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
879 array_append(&ctx->callbacks, &cb, 1); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
880 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
881 |
17839
e588792b4f20
lib: Code cleanup - check io_loop_context_add/remove_callbacks() callback parameters.
Timo Sirainen <tss@iki.fi>
parents:
17720
diff
changeset
|
882 #undef io_loop_context_remove_callbacks |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
883 void io_loop_context_remove_callbacks(struct ioloop_context *ctx, |
13285
c17e4f8ddc81
liblib: io_loop_context_remove_callbacks() now requires also callbacks.
Timo Sirainen <tss@iki.fi>
parents:
13252
diff
changeset
|
884 io_callback_t *activate, |
c17e4f8ddc81
liblib: io_loop_context_remove_callbacks() now requires also callbacks.
Timo Sirainen <tss@iki.fi>
parents:
13252
diff
changeset
|
885 io_callback_t *deactivate, void *context) |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
886 { |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
887 struct ioloop_context_callback *cb; |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
888 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
889 array_foreach_modifiable(&ctx->callbacks, cb) { |
13285
c17e4f8ddc81
liblib: io_loop_context_remove_callbacks() now requires also callbacks.
Timo Sirainen <tss@iki.fi>
parents:
13252
diff
changeset
|
890 if (cb->context == context && |
c17e4f8ddc81
liblib: io_loop_context_remove_callbacks() now requires also callbacks.
Timo Sirainen <tss@iki.fi>
parents:
13252
diff
changeset
|
891 cb->activate == activate && cb->deactivate == deactivate) { |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
892 /* simply mark it as deleted, since we could get |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
893 here from activate/deactivate loop */ |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
894 cb->activate = NULL; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
895 cb->deactivate = NULL; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
896 cb->context = NULL; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
897 return; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
898 } |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
899 } |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
900 i_panic("io_loop_context_remove_callbacks() context not found"); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
901 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
902 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
903 static void |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
904 io_loop_context_remove_deleted_callbacks(struct ioloop_context *ctx) |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
905 { |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
906 const struct ioloop_context_callback *cbs; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
907 unsigned int i, count; |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
908 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
909 cbs = array_get(&ctx->callbacks, &count); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
910 for (i = 0; i < count; ) { |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
911 if (cbs[i].activate != NULL) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
912 i++; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
913 else { |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
914 array_delete(&ctx->callbacks, i, 1); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
915 cbs = array_get(&ctx->callbacks, &count); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
916 } |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
917 } |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
918 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
919 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
920 void io_loop_context_activate(struct ioloop_context *ctx) |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
921 { |
18291
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
922 struct ioloop_context_callback *cb; |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
923 |
14928 | 924 i_assert(ctx->ioloop->cur_ctx == NULL); |
925 | |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
926 ctx->ioloop->cur_ctx = ctx; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
927 io_loop_context_ref(ctx); |
18291
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
928 array_foreach_modifiable(&ctx->callbacks, cb) { |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
929 i_assert(!cb->activated); |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
930 if (cb->activate != NULL) |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
931 cb->activate(cb->context); |
18291
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
932 cb->activated = TRUE; |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
933 } |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
934 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
935 |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
936 void io_loop_context_deactivate(struct ioloop_context *ctx) |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
937 { |
18291
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
938 struct ioloop_context_callback *cb; |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
939 |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
940 i_assert(ctx->ioloop->cur_ctx != NULL); |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
941 |
18291
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
942 array_foreach_modifiable(&ctx->callbacks, cb) { |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
943 if (!cb->activated) { |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
944 /* we just added this callback. don't deactivate it |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
945 before it gets first activated. */ |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
946 } else { |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
947 if (cb->deactivate != NULL) |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
948 cb->deactivate(cb->context); |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
949 cb->activated = FALSE; |
c98991820dde
lib: Don't call ioloop context deactivate() if activate() hasn't been called yet.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
950 } |
13252
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
951 } |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
952 ctx->ioloop->cur_ctx = NULL; |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
953 io_loop_context_remove_deleted_callbacks(ctx); |
32315c24992c
Replaced "ioloop log" with a more generic "ioloop context".
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
954 io_loop_context_unref(&ctx); |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
955 } |
12578
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
956 |
13286
b6b16c9eb3d5
liblib: Added io_loop_get_current_context()
Timo Sirainen <tss@iki.fi>
parents:
13285
diff
changeset
|
957 struct ioloop_context *io_loop_get_current_context(struct ioloop *ioloop) |
b6b16c9eb3d5
liblib: Added io_loop_get_current_context()
Timo Sirainen <tss@iki.fi>
parents:
13285
diff
changeset
|
958 { |
b6b16c9eb3d5
liblib: Added io_loop_get_current_context()
Timo Sirainen <tss@iki.fi>
parents:
13285
diff
changeset
|
959 return ioloop->cur_ctx; |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
960 } |
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
961 |
12578
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
962 struct io *io_loop_move_io(struct io **_io) |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
963 { |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
964 struct io *old_io = *_io; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
965 struct io_file *old_io_file, *new_io_file; |
12578
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
966 |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
967 i_assert((old_io->condition & IO_NOTIFY) == 0); |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
968 |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
969 if (old_io->ioloop == current_ioloop) |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
970 return old_io; |
12499 | 971 |
12578
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
972 old_io_file = (struct io_file *)old_io; |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
973 new_io_file = io_add_file(old_io_file->fd, old_io->condition, |
20811 | 974 old_io->source_filename, |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
975 old_io->source_linenum, |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
976 old_io->callback, old_io->context); |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
977 if (old_io_file->istream != NULL) { |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
978 /* reference before io_remove() */ |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
979 new_io_file->istream = old_io_file->istream; |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
980 i_stream_ref(new_io_file->istream); |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
981 } |
17187
d2a6f57e174f
ioloop: Added io_set_pending()
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
982 if (old_io->pending) |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
983 io_set_pending(&new_io_file->io); |
12578
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
984 io_remove(_io); |
17188
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
985 if (new_io_file->istream != NULL) { |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
986 /* update istream io after it was removed with io_remove() */ |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
987 i_stream_set_io(new_io_file->istream, &new_io_file->io); |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
988 } |
fd186eff7325
Added io_add_istream() and related functionality for combining the ioloop/istream.
Timo Sirainen <tss@iki.fi>
parents:
17187
diff
changeset
|
989 return &new_io_file->io; |
12497
1bac1c09201a
ioloop: Added support for per-io/timeout callback log prefix automation.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
990 } |
12578
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
991 |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
992 struct timeout *io_loop_move_timeout(struct timeout **_timeout) |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
993 { |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
994 struct timeout *new_to, *old_to = *_timeout; |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
995 |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
996 if (old_to->ioloop == current_ioloop) |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
997 return old_to; |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
998 |
17878
312dd5c349f5
lib: Fixed io_loop_move_timeout() to retain the next_run time, so that the timeout is not implicitly reset.
Stephan Bosch <stephan@rename-it.nl>
parents:
17877
diff
changeset
|
999 new_to = timeout_copy(old_to); |
12578
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
1000 timeout_remove(_timeout); |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
1001 return new_to; |
7785af0ca36e
Added io_loop_move_io() and io_loop_move_timeout().
Timo Sirainen <tss@iki.fi>
parents:
12500
diff
changeset
|
1002 } |
15973 | 1003 |
1004 bool io_loop_have_ios(struct ioloop *ioloop) | |
1005 { | |
16303
46dc61f6acae
Compiling fix for Sun compilers.
Timo Sirainen <tss@iki.fi>
parents:
15994
diff
changeset
|
1006 return ioloop->io_files != NULL; |
15973 | 1007 } |
15994
6daf58f568a0
Added io_loop_have_immediate_timeouts()
Timo Sirainen <tss@iki.fi>
parents:
15987
diff
changeset
|
1008 |
6daf58f568a0
Added io_loop_have_immediate_timeouts()
Timo Sirainen <tss@iki.fi>
parents:
15987
diff
changeset
|
1009 bool io_loop_have_immediate_timeouts(struct ioloop *ioloop) |
6daf58f568a0
Added io_loop_have_immediate_timeouts()
Timo Sirainen <tss@iki.fi>
parents:
15987
diff
changeset
|
1010 { |
6daf58f568a0
Added io_loop_have_immediate_timeouts()
Timo Sirainen <tss@iki.fi>
parents:
15987
diff
changeset
|
1011 struct timeval tv; |
6daf58f568a0
Added io_loop_have_immediate_timeouts()
Timo Sirainen <tss@iki.fi>
parents:
15987
diff
changeset
|
1012 |
6daf58f568a0
Added io_loop_have_immediate_timeouts()
Timo Sirainen <tss@iki.fi>
parents:
15987
diff
changeset
|
1013 return io_loop_get_wait_time(ioloop, &tv) == 0; |
6daf58f568a0
Added io_loop_have_immediate_timeouts()
Timo Sirainen <tss@iki.fi>
parents:
15987
diff
changeset
|
1014 } |
19160
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
1015 |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
1016 uint64_t io_loop_get_wait_usecs(struct ioloop *ioloop) |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
1017 { |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
1018 return ioloop->ioloop_wait_usecs; |
1076679adf9f
lib: Added io_loop_get_wait_usecs()
Timo Sirainen <tss@iki.fi>
parents:
19025
diff
changeset
|
1019 } |
19354
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1020 |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1021 enum io_condition io_loop_find_fd_conditions(struct ioloop *ioloop, int fd) |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1022 { |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1023 enum io_condition conditions = 0; |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1024 struct io_file *io; |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1025 |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1026 i_assert(fd >= 0); |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1027 |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1028 for (io = ioloop->io_files; io != NULL; io = io->next) { |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1029 if (io->fd == fd) |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1030 conditions |= io->io.condition; |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1031 } |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1032 return conditions; |
2f3b58470752
lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents:
19160
diff
changeset
|
1033 } |
21106
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1034 |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1035 #undef io_wait_timer_add |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1036 struct io_wait_timer * |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1037 io_wait_timer_add(const char *source_filename, unsigned int source_linenum) |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1038 { |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1039 struct io_wait_timer *timer; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1040 |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1041 timer = i_new(struct io_wait_timer, 1); |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1042 timer->ioloop = current_ioloop; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1043 timer->source_filename = source_filename; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1044 timer->source_linenum = source_linenum; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1045 DLLIST_PREPEND(¤t_ioloop->wait_timers, timer); |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1046 return timer; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1047 } |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1048 |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1049 struct io_wait_timer *io_wait_timer_move(struct io_wait_timer **_timer) |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1050 { |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1051 struct io_wait_timer *timer = *_timer; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1052 |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1053 *_timer = NULL; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1054 DLLIST_REMOVE(&timer->ioloop->wait_timers, timer); |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1055 DLLIST_PREPEND(¤t_ioloop->wait_timers, timer); |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1056 timer->ioloop = current_ioloop; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1057 return timer; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1058 } |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1059 |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1060 void io_wait_timer_remove(struct io_wait_timer **_timer) |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1061 { |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1062 struct io_wait_timer *timer = *_timer; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1063 |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1064 *_timer = NULL; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1065 DLLIST_REMOVE(&timer->ioloop->wait_timers, timer); |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1066 i_free(timer); |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1067 } |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1068 |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1069 uint64_t io_wait_timer_get_usecs(struct io_wait_timer *timer) |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1070 { |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1071 return timer->usecs; |
97386e9e8c13
lib: Added io_wait_timer
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21105
diff
changeset
|
1072 } |