user->username_hash));
}
-void director_set_state_changed(struct director *dir)
+static void director_state_callback_timeout(struct director *dir)
{
+ timeout_remove(&dir->to_callback);
dir->state_change_callback(dir);
}
+void director_set_state_changed(struct director *dir)
+{
+ /* we may get called to here from various places. use a timeout to
+ make sure the state callback is called with a clean state. */
+ if (dir->to_callback == NULL) {
+ dir->to_callback =
+ timeout_add(0, director_state_callback_timeout, dir);
+ }
+}
+
void director_update_send(struct director *dir, struct director_host *src,
const char *cmd)
{
timeout_remove(&dir->to_sync);
if (dir->to_remove_dirs != NULL)
timeout_remove(&dir->to_remove_dirs);
+ if (dir->to_callback != NULL)
+ timeout_remove(&dir->to_callback);
while (array_count(&dir->dir_hosts) > 0) {
hostp = array_idx(&dir->dir_hosts, 0);
host = *hostp;
ARRAY_DEFINE(connections, struct director_connection *);
struct timeout *to_reconnect;
struct timeout *to_sync;
+ struct timeout *to_callback;
/* current mail hosts */
struct mail_host_list *mail_hosts;