/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_log_class_init(AgsLogClass *log); void ags_log_init (AgsLog *log); void ags_log_finalize(GObject *gobject); /** * SECTION:ags_log * @short_description: Log * @title: AgsLog * @section_id: * @include: ags/lib/ags_log.h * * The #AgsLog logging class. */ static gpointer ags_log_parent_class = NULL; AgsLog *ags_log = NULL; GType ags_log_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_log = 0; static const GTypeInfo ags_log_info = { sizeof (AgsLogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_log_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_log_init, }; ags_type_log = g_type_register_static(G_TYPE_OBJECT, "AgsLog", &ags_log_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_log); } return g_define_type_id__volatile; } void ags_log_class_init(AgsLogClass *log) { GObjectClass *gobject; ags_log_parent_class = g_type_class_peek_parent(log); /* GObjectClass */ gobject = (GObjectClass *) log; gobject->finalize = ags_log_finalize; } void ags_log_init(AgsLog *log) { log->flags = 0; /* create mutex */ g_rec_mutex_init(&(log->obj_mutex)); log->messages = NULL; } void ags_log_finalize(GObject *gobject) { AgsLog *log; log = AGS_LOG(gobject); /* free messages and list */ g_list_free_full(g_atomic_pointer_get(&(log->messages)), g_free); if(log == ags_log){ ags_log = NULL; } /* call parent */ G_OBJECT_CLASS(ags_log_parent_class)->finalize(gobject); } /** * ags_log_get_instance: * * Get your logging instance. * * Returns: (transfer none): the #AgsLog instance * * Since: 3.0.0 */ AgsLog* ags_log_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_log == NULL){ ags_log = ags_log_new(); } g_mutex_unlock(&mutex); return(ags_log); } /** * ags_log_add_message: * @log: the #AgsLog * @str: (transfer full): the message * * Add a message to @log. * * Since: 3.0.0 */ void ags_log_add_message(AgsLog *log, gchar *str) { g_rec_mutex_lock(&(log->obj_mutex)); g_atomic_pointer_set(&(log->messages), g_list_prepend(g_atomic_pointer_get(&(log->messages)), g_strdup(str))); g_rec_mutex_unlock(&(log->obj_mutex)); } /** * ags_log_get_messages: * @log: the #AgsLog * * Get log messages as #GList-struct containing strings. * * Returns: (element-type utf8) (transfer none): the #GList-struct containing log messages * * Since: 3.0.0 */ GList* ags_log_get_messages(AgsLog *log) { return(g_atomic_pointer_get(&(log->messages))); } /** * ags_log_new: * * Instantiate a new #AgsLog. * * Returns: the new instance * * Since: 3.0.0 */ AgsLog* ags_log_new() { AgsLog *log; log = g_object_new(AGS_TYPE_LOG, NULL); return(log); }