From: Andy Spencer Date: Sat, 1 May 2010 00:30:44 +0000 (+0000) Subject: Improve high-level threading X-Git-Tag: v0.4~31 X-Git-Url: http://pileus.org/git/?p=aweather;a=commitdiff_plain;h=4ee3ef055348ac38562d425cf972091b2c2bc589 Improve high-level threading - Make use of gdk_threads_{enter,leave} - Add thread ID to debug messages - Improved debugging for Level2 --- diff --git a/src/main.c b/src/main.c index 71d7468..cb8568e 100644 --- a/src/main.c +++ b/src/main.c @@ -18,6 +18,7 @@ #include #include #include +#include #include @@ -29,8 +30,13 @@ static gint log_levels = 0; static void log_func(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer udata) { - if (log_level & log_levels) - g_log_default_handler(log_domain, log_level, message, udata); + if (log_level & log_levels) { + if (log_level == G_LOG_LEVEL_DEBUG) + g_fprintf(stderr, "DEBUG: (%p) %s\n", + g_thread_self(), message); + else + g_log_default_handler(log_domain, log_level, message, udata); + } } static void on_log_level_changed(GtkSpinButton *spinner, AWeatherGui *self) @@ -68,6 +74,7 @@ int main(int argc, char *argv[]) /* Init */ GError *error = NULL; g_thread_init(NULL); + gdk_threads_init(); if (!gtk_init_with_args(&argc, &argv, "aweather", entries, NULL, &error)) { g_print("%s\n", error->message); g_error_free(error); @@ -81,7 +88,8 @@ int main(int argc, char *argv[]) g_log_set_handler(NULL, G_LOG_LEVEL_MASK, log_func, NULL); /* Set up AWeather */ - AWeatherGui *gui = aweather_gui_new(); + gdk_threads_enter(); + AWeatherGui *gui = aweather_gui_new(); gint prefs_debug = gis_prefs_get_integer(gui->prefs, "aweather/log_level", NULL); gchar *prefs_site = gis_prefs_get_string(gui->prefs, "aweather/initial_site", NULL); @@ -107,5 +115,6 @@ int main(int argc, char *argv[]) gtk_widget_show_all(GTK_WIDGET(gui)); gtk_main(); + gdk_threads_leave(); return 0; } diff --git a/src/plugins/level2.c b/src/plugins/level2.c index 50e500e..b1a7fad 100644 --- a/src/plugins/level2.c +++ b/src/plugins/level2.c @@ -200,6 +200,7 @@ static gboolean _set_sweep_cb(gpointer _self) glDeleteTextures(1, &self->sweep_tex); _load_sweep_gl(self->sweep, self->sweep_colors, &self->sweep_tex); gtk_widget_queue_draw(GTK_WIDGET(self->viewer)); + g_object_unref(self); return FALSE; } void aweather_level2_set_sweep(AWeatherLevel2 *self, @@ -221,6 +222,7 @@ void aweather_level2_set_sweep(AWeatherLevel2 *self, if (!self->sweep_colors) return; /* Load data */ + g_object_ref(self); g_idle_add(_set_sweep_cb, self); } @@ -276,8 +278,19 @@ static void aweather_level2_init(AWeatherLevel2 *self) GIS_CALLBACK(self)->callback = _draw_radar; GIS_CALLBACK(self)->user_data = self; } - +static void aweather_level2_dispose(GObject *_self) +{ + g_debug("AWeatherLevel2: dispose - %p", _self); + G_OBJECT_CLASS(aweather_level2_parent_class)->dispose(_self); +} +static void aweather_level2_finalize(GObject *_self) +{ + g_debug("AWeatherLevel2: finalize - %p", _self); + G_OBJECT_CLASS(aweather_level2_parent_class)->finalize(_self); +} static void aweather_level2_class_init(AWeatherLevel2Class *klass) { + G_OBJECT_CLASS(klass)->finalize = aweather_level2_finalize; + G_OBJECT_CLASS(klass)->dispose = aweather_level2_dispose; }