%PDF- %PDF-
Direktori : /backups/router/usr/local/include/syslog-ng/ |
Current File : //backups/router/usr/local/include/syslog-ng/logqueue.h |
/* * Copyright (c) 2002-2011 Balabit * Copyright (c) 1998-2011 Balázs Scheidler * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * As an additional exemption you are allowed to compile & link against the * OpenSSL libraries as published by the OpenSSL project. See the file * COPYING for details. * */ #ifndef LOGQUEUE_H_INCLUDED #define LOGQUEUE_H_INCLUDED #include "logmsg/logmsg.h" #include "stats/stats-registry.h" #include "stats/stats-cluster-key-builder.h" typedef void (*LogQueuePushNotifyFunc)(gpointer user_data); typedef struct _LogQueue LogQueue; typedef const char *QueueType; typedef struct _LogQueueMetrics { struct { StatsClusterKey *output_events_sc_key; StatsClusterKey *memory_usage_sc_key; StatsCounterItem *queued_messages; StatsCounterItem *dropped_messages; StatsCounterItem *memory_usage; } shared; struct { StatsClusterKey *events_sc_key; StatsClusterKey *memory_usage_sc_key; StatsCounterItem *memory_usage; StatsCounterItem *queued_messages; } owned; } LogQueueMetrics; struct _LogQueue { QueueType type; GAtomicCounter ref_cnt; gint throttle; gint throttle_buckets; struct timespec last_throttle_check; gchar *persist_name; LogQueueMetrics metrics; GMutex lock; LogQueuePushNotifyFunc parallel_push_notify; gpointer parallel_push_data; GDestroyNotify parallel_push_data_destroy; /* queue management */ gboolean (*keep_on_reload)(LogQueue *self); gint64 (*get_length)(LogQueue *self); gboolean (*is_empty_racy)(LogQueue *self); void (*push_tail)(LogQueue *self, LogMessage *msg, const LogPathOptions *path_options); LogMessage *(*pop_head)(LogQueue *self, LogPathOptions *path_options); LogMessage *(*peek_head)(LogQueue *self); void (*ack_backlog)(LogQueue *self, gint n); void (*rewind_backlog)(LogQueue *self, guint rewind_count); void (*rewind_backlog_all)(LogQueue *self); void (*free_fn)(LogQueue *self); }; static inline gboolean log_queue_keep_on_reload(LogQueue *self) { if (self->keep_on_reload) return self->keep_on_reload(self); return TRUE; } static inline gint64 log_queue_get_length(LogQueue *self) { return self->get_length(self); } static inline gboolean log_queue_is_empty_racy(LogQueue *self) { if (self->is_empty_racy) return self->is_empty_racy(self); else return (self->get_length(self) == 0); } static inline void log_queue_push_tail(LogQueue *self, LogMessage *msg, const LogPathOptions *path_options) { self->push_tail(self, msg, path_options); } static inline LogMessage * log_queue_pop_head(LogQueue *self, LogPathOptions *path_options) { LogMessage *msg = NULL; if (self->throttle && self->throttle_buckets == 0) return NULL; msg = self->pop_head(self, path_options); if (msg && self->throttle_buckets > 0) self->throttle_buckets--; return msg; } static inline LogMessage * log_queue_peek_head(LogQueue *self) { return self->peek_head(self); } static inline LogMessage * log_queue_pop_head_ignore_throttle(LogQueue *self, LogPathOptions *path_options) { return self->pop_head(self, path_options); } static inline void log_queue_rewind_backlog(LogQueue *self, guint rewind_count) { self->rewind_backlog(self, rewind_count); } static inline void log_queue_rewind_backlog_all(LogQueue *self) { self->rewind_backlog_all(self); } static inline void log_queue_ack_backlog(LogQueue *self, guint rewind_count) { self->ack_backlog(self, rewind_count); } static inline LogQueue * log_queue_ref(LogQueue *self) { g_assert(!self || g_atomic_counter_get(&self->ref_cnt) > 0); if (self) { g_atomic_counter_inc(&self->ref_cnt); } return self; } static inline void log_queue_unref(LogQueue *self) { g_assert(!self || g_atomic_counter_get(&self->ref_cnt) > 0); if (self && g_atomic_counter_dec_and_test(&self->ref_cnt)) { if (self->free_fn) self->free_fn(self); } } static inline void log_queue_set_throttle(LogQueue *self, gint throttle) { self->throttle = throttle; self->throttle_buckets = throttle; } static inline gboolean log_queue_has_type(LogQueue *self, QueueType type) { return g_strcmp0(self->type, type) == 0; } void log_queue_memory_usage_add(LogQueue *self, gsize value); void log_queue_memory_usage_sub(LogQueue *self, gsize value); void log_queue_queued_messages_add(LogQueue *self, gsize value); void log_queue_queued_messages_sub(LogQueue *self, gsize value); void log_queue_queued_messages_inc(LogQueue *self); void log_queue_queued_messages_dec(LogQueue *self); void log_queue_queued_messages_reset(LogQueue *self); void log_queue_dropped_messages_inc(LogQueue *self); void log_queue_push_notify(LogQueue *self); void log_queue_reset_parallel_push(LogQueue *self); void log_queue_set_parallel_push(LogQueue *self, LogQueuePushNotifyFunc parallel_push_notify, gpointer user_data, GDestroyNotify user_data_destroy); gboolean log_queue_check_items(LogQueue *self, gint *timeout, LogQueuePushNotifyFunc parallel_push_notify, gpointer user_data, GDestroyNotify user_data_destroy); void log_queue_init_instance(LogQueue *self, const gchar *persist_name, gint stats_level, StatsClusterKeyBuilder *driver_sck_builder, StatsClusterKeyBuilder *queue_sck_builder); void log_queue_free_method(LogQueue *self); #endif