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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 ((tvp)->tv_sec > (uvp)->tv_sec || \
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 ((tvp)->tv_sec == (uvp)->tv_sec && \
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 (tvp)->tv_usec > (uvp)->tv_usec))
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 {
5248
12ac5f685814 Various cleanups to ioloop code.
Timo Sirainen <tss@iki.fi>
parents: 5242
diff changeset
41 struct io_file *io;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 io->fd = fd;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
92 struct io *io_add_istream(struct istream *input, const char *source_filename,
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
98 io = io_add_file(i_stream_get_fd(input), IO_READ, source_filename,
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
122 static void io_remove_full(struct io **_io, bool closed)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
06e3cff76570 Added assert.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
126 i_assert(io->callback != NULL);
06e3cff76570 Added assert.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
8100
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
167 void io_remove(struct io **io)
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
168 {
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
169 io_remove_full(io, FALSE);
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
170 }
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
171
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
172 void io_remove_closed(struct io **io)
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
173 {
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
174 i_assert(((*io)->condition & IO_NOTIFY) == 0);
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
175
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
176 io_remove_full(io, TRUE);
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
177 }
83aef3a6c0a3 Added io_remove_closed().
Timo Sirainen <tss@iki.fi>
parents: 7537
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 {
1203
6b99a5b076a6 Check gettimeofday() failures
Timo Sirainen <tss@iki.fi>
parents: 1171
diff changeset
191 if (tv_now == NULL) {
6b99a5b076a6 Check gettimeofday() failures
Timo Sirainen <tss@iki.fi>
parents: 1171
diff changeset
192 if (gettimeofday(&timeout->next_run, NULL) < 0)
6b99a5b076a6 Check gettimeofday() failures
Timo Sirainen <tss@iki.fi>
parents: 1171
diff changeset
193 i_fatal("gettimeofday(): %m");
6b99a5b076a6 Check gettimeofday() failures
Timo Sirainen <tss@iki.fi>
parents: 1171
diff changeset
194 } else {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 timeout->next_run.tv_sec = tv_now->tv_sec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 timeout->next_run.tv_usec = tv_now->tv_usec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 /* we don't want microsecond accuracy or this function will be
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 timeout->next_run.tv_sec += timeout->msecs/1000;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 timeout->next_run.tv_usec += (timeout->msecs%1000)*1000;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 if (timeout->next_run.tv_usec > 1000000) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 timeout->next_run.tv_sec++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 timeout->next_run.tv_usec -= 1000000;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
236 struct timeout *timeout_add(unsigned int msecs, const char *source_filename,
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 return timeout;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
259 timeout_add_short(unsigned int msecs, const char *source_filename,
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
275 timeout = timeout_add_common(source_filename, source_linenum,
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
290 (old_to->source_filename, old_to->source_linenum,
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
6b99a5b076a6 Check gettimeofday() failures
Timo Sirainen <tss@iki.fi>
parents: 1171
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
6b99a5b076a6 Check gettimeofday() failures
Timo Sirainen <tss@iki.fi>
parents: 1171
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
963482677c0b Memory leak fix
Timo Sirainen <tss@iki.fi>
parents: 14473
diff changeset
574 io_loop_context_deactivate(ioloop->cur_ctx);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
623 while (ioloop->running)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
626 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655 ioloop->running = FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 ioloop->running = TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
e37e626902c3 Added io_loop_is_running()
Timo Sirainen <tss@iki.fi>
parents: 953
diff changeset
669 {
e37e626902c3 Added io_loop_is_running()
Timo Sirainen <tss@iki.fi>
parents: 953
diff changeset
670 return ioloop->running;
e37e626902c3 Added io_loop_is_running()
Timo Sirainen <tss@iki.fi>
parents: 953
diff changeset
671 }
e37e626902c3 Added io_loop_is_running()
Timo Sirainen <tss@iki.fi>
parents: 953
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
683
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
6b99a5b076a6 Check gettimeofday() failures
Timo Sirainen <tss@iki.fi>
parents: 1171
diff changeset
686 i_fatal("gettimeofday(): %m");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 ioloop_time = ioloop_timeval.tv_sec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 return ioloop;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
700 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721
20811
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
734 i_warning("Timeout leak: %p (%s:%u)", (void *)to->callback,
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744
20811
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
745 i_warning("Timeout leak: %p (%s:%u)", (void *)to->callback,
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
23eb7ec9c37d ioloop log: Added asserts
Timo Sirainen <tss@iki.fi>
parents: 12497
diff changeset
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
963482677c0b Memory leak fix
Timo Sirainen <tss@iki.fi>
parents: 14473
diff changeset
924 i_assert(ctx->ioloop->cur_ctx == NULL);
963482677c0b Memory leak fix
Timo Sirainen <tss@iki.fi>
parents: 14473
diff changeset
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
23eb7ec9c37d ioloop log: Added asserts
Timo Sirainen <tss@iki.fi>
parents: 12497
diff changeset
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
1bd9c2258fd9 io: Add source filename
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20770
diff changeset
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
4517f9b201f2 Added io_loop_have_ios()
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
1003
4517f9b201f2 Added io_loop_have_ios()
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
1004 bool io_loop_have_ios(struct ioloop *ioloop)
4517f9b201f2 Added io_loop_have_ios()
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
1005 {
16303
46dc61f6acae Compiling fix for Sun compilers.
Timo Sirainen <tss@iki.fi>
parents: 15994
diff changeset
1006 return ioloop->io_files != NULL;
15973
4517f9b201f2 Added io_loop_have_ios()
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
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(&current_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(&current_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 }