89
90
nd_thread_register_canceller(rrd_functions_worker_canceller, wg);
91
92
- bool last_acquired = true;
92
while (true) {
93
+ const DICTIONARY_ITEM *acquired = NULL;
94
+ struct functions_evloop_worker_job *j;
95
+
96
netdata_mutex_lock(&wg->worker_mutex);
97
96
- if(__atomic_load_n(&wg->workers_exit, __ATOMIC_RELAXED) || nd_thread_signaled_to_cancel()) {
97
- netdata_mutex_unlock(&wg->worker_mutex);
98
- break;
99
- }
98
+ // Keep the scan and the wait under worker_mutex so a new-job signal
99
+ // cannot land after we decide to sleep but before the thread blocks.
100
+ while(!__atomic_load_n(&wg->workers_exit, __ATOMIC_RELAXED) && !nd_thread_signaled_to_cancel()) {
101
+ dfe_start_write(wg->worker_queue, j) {
102
+ if(j->running || __atomic_load_n(&j->cancelled, __ATOMIC_RELAXED))
103
+ continue;
104
101
- if(dictionary_entries(wg->worker_queue) == 0 || !last_acquired)
102
- netdata_cond_wait(&wg->worker_cond_var, &wg->worker_mutex);
105
+ acquired = dictionary_acquired_item_dup(wg->worker_queue, j_dfe.item);
106
+ j->running = true;
107
+ break;
108
+ }
109
+ dfe_done(j);
110
104
- const DICTIONARY_ITEM *acquired = NULL;
105
- struct functions_evloop_worker_job *j;
106
- dfe_start_write(wg->worker_queue, j) {
107
- if(j->running || j->cancelled)
108
- continue;
111
+ if(acquired)
112
+ break;
113
110
- acquired = dictionary_acquired_item_dup(wg->worker_queue, j_dfe.item);
111
- j->running = true;
112
- break;
114
+ netdata_cond_wait(&wg->worker_cond_var, &wg->worker_mutex);
115
}
114
- dfe_done(j);
116
117
netdata_mutex_unlock(&wg->worker_mutex);
118
130
};
131
ND_LOG_STACK_PUSH(lgs);
132
132
- last_acquired = true;
133
j = dictionary_acquired_item_value(acquired);
134
j->cb(j->transaction, j->cmd, &j->stop_monotonic_ut, &j->cancelled, j->payload, j->access, j->source, j->cb_data);
135
dictionary_del(wg->worker_queue, j->transaction);
136
dictionary_acquired_item_release(wg->worker_queue, acquired);
137
dictionary_garbage_collect(wg->worker_queue);
138
}
139
- else
140
- last_acquired = false;
139
}
140
}
141