Browse Source

[Minor] Try to fix mess with refcounts

pull/4937/head
Vsevolod Stakhov 1 week ago
parent
commit
bd95a45f15
No account linked to committer's email address
1 changed files with 9 additions and 9 deletions
  1. 9
    9
      src/libserver/rspamd_control.c

+ 9
- 9
src/libserver/rspamd_control.c View File

@@ -358,7 +358,11 @@ void rspamd_pending_control_free(gpointer p)
{
struct rspamd_control_reply_elt *rep_elt = (struct rspamd_control_reply_elt *) p;

rspamd_ev_watcher_stop(rep_elt->event_loop, &rep_elt->ev);
if (rep_elt->sent) {
rspamd_ev_watcher_stop(rep_elt->event_loop, &rep_elt->ev);
}

g_hash_table_unref(rep_elt->pending_elts);
g_free(rep_elt);
}

@@ -405,7 +409,7 @@ rspamd_control_stop_pending(struct rspamd_control_reply_elt *elt)
g_quark_to_string(elt->wrk_type),
(int) pending);

if (pending != 0) {
if (elt->worker->state != rspamd_worker_state_terminating && pending != 0) {
/* Invoke another event from the queue */
GHashTableIter it;
gpointer k, v;
@@ -445,8 +449,6 @@ rspamd_control_stop_pending(struct rspamd_control_reply_elt *elt)
cur->worker->control_pipe[0],
strerror(errno));
g_hash_table_remove(elt->pending_elts, cur);
/* Free one refcounter on a hash table as it was taken by `cur` */
g_hash_table_unref(htb);
}
}
}
@@ -454,9 +456,6 @@ rspamd_control_stop_pending(struct rspamd_control_reply_elt *elt)

/* Remove from hash and performs the cleanup */
g_hash_table_remove(elt->pending_elts, elt);

/* Release hash reference */
g_hash_table_unref(htb);
}

static struct rspamd_control_reply_elt *
@@ -500,7 +499,6 @@ rspamd_control_broadcast_cmd(struct rspamd_main *rspamd_main,
rep_elt->event_loop = rspamd_main->event_loop;
rep_elt->ud = ud;
rep_elt->handler = handler;
rep_elt->pending_elts = g_hash_table_ref(wrk->control_events_pending);
memcpy(&rep_elt->cmd, cmd, sizeof(*cmd));
rep_elt->sent = false;

@@ -516,8 +514,9 @@ rspamd_control_broadcast_cmd(struct rspamd_main *rspamd_main,
rep_elt);
rspamd_ev_watcher_start(rspamd_main->event_loop,
&rep_elt->ev, worker_io_timeout);
g_hash_table_insert(wrk->control_events_pending, rep_elt, rep_elt);
rep_elt->sent = true;
rep_elt->pending_elts = g_hash_table_ref(wrk->control_events_pending);
g_hash_table_insert(wrk->control_events_pending, rep_elt, rep_elt);

DL_APPEND(res, rep_elt);
msg_debug_control("sent command %d to the worker %P(%s), fd: %d",
@@ -542,6 +541,7 @@ rspamd_control_broadcast_cmd(struct rspamd_main *rspamd_main,
wrk->pid,
g_quark_to_string(wrk->type),
(int) g_hash_table_size(wrk->control_events_pending));
rep_elt->pending_elts = g_hash_table_ref(wrk->control_events_pending);
g_hash_table_insert(wrk->control_events_pending, rep_elt, rep_elt);
DL_APPEND(res, rep_elt);
}

Loading…
Cancel
Save