]> Pileus Git - aweather/commitdiff
Improve high-level threading
authorAndy Spencer <andy753421@gmail.com>
Sat, 1 May 2010 00:30:44 +0000 (00:30 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sat, 1 May 2010 00:30:44 +0000 (00:30 +0000)
- Make use of gdk_threads_{enter,leave}
- Add thread ID to debug messages
- Improved debugging for Level2

src/main.c
src/plugins/level2.c

index 71d74689bf53f03eb5c95a89e922fd44e4d8dcf8..cb8568e5711d4811ae3c867d0a0348e365a35fe0 100644 (file)
@@ -18,6 +18,7 @@
 #include <config.h>
 #include <gtk/gtk.h>
 #include <gtk/gtkgl.h>
+#include <glib/gstdio.h>
 
 #include <gis.h>
 
@@ -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;
 }
index 50e500e056f51f0681decd58fc341d893c7fc063..b1a7fad645bf5b02b859ba4069ee0502f75b4b73 100644 (file)
@@ -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;
 }