static void afamqp_worker_thread_init(LogThrDestDriver *d) { AMQPDestDriver *self = (AMQPDestDriver *)d; afamqp_dd_connect(self, FALSE); }
static gboolean afamqp_worker_insert(LogThrDestDriver *s) { AMQPDestDriver *self = (AMQPDestDriver *)s; gboolean success; LogMessage *msg; LogPathOptions path_options = LOG_PATH_OPTIONS_INIT; afamqp_dd_connect(self, TRUE); success = log_queue_pop_head(s->queue, &msg, &path_options, FALSE, FALSE); if (!success) return TRUE; msg_set_context(msg); success = afamqp_worker_publish (self, msg); msg_set_context(NULL); if (success) { stats_counter_inc(s->stored_messages); step_sequence_number(&self->seq_num); log_msg_ack(msg, &path_options); log_msg_unref(msg); } else log_queue_push_head(s->queue, msg, &path_options); return success; }
static worker_insert_result_t afamqp_worker_insert(LogThrDestDriver *s, LogMessage *msg) { AMQPDestDriver *self = (AMQPDestDriver *)s; if (!afamqp_dd_connect(self, TRUE)) return WORKER_INSERT_RESULT_NOT_CONNECTED; if (!afamqp_worker_publish (self, msg)) return WORKER_INSERT_RESULT_ERROR; return WORKER_INSERT_RESULT_SUCCESS; }
static gpointer afamqp_worker_thread(gpointer arg) { AMQPDestDriver *self = (AMQPDestDriver *) arg; msg_debug("Worker thread started", evt_tag_str("driver", self->super.super.id), NULL); afamqp_dd_connect(self, FALSE); while (!self->writer_thread_terminate) { g_mutex_lock(self->suspend_mutex); if (self->writer_thread_suspended) { g_cond_timed_wait(self->writer_thread_wakeup_cond, self->suspend_mutex, &self->writer_thread_suspend_target); self->writer_thread_suspended = FALSE; g_mutex_unlock(self->suspend_mutex); } else if (!log_queue_check_items(self->queue, NULL, afamqp_dd_message_became_available_in_the_queue, self, NULL)) { g_cond_wait(self->writer_thread_wakeup_cond, self->suspend_mutex); g_mutex_unlock(self->suspend_mutex); } else g_mutex_unlock(self->suspend_mutex); if (self->writer_thread_terminate) break; if (!afamqp_worker_insert(self)) { afamqp_dd_disconnect(self); afamqp_dd_suspend(self); } } afamqp_dd_disconnect(self); msg_debug("Worker thread finished", evt_tag_str("driver", self->super.super.id), NULL); return NULL; }