From ba4b91f8cb014e34b496070aeb806415c363434f Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Sat, 11 Feb 2012 21:00:00 +0000 Subject: [PATCH] Improve shutdown code - Make dispose functions reentrant - Remove idle function from GPS plugin - Remove GPSd input from GPS plugin --- src/aweather-gui.c | 9 ++++++--- src/plugins/gps-plugin.c | 31 ++++++++++++++++++++----------- src/plugins/gps-plugin.h | 1 + src/plugins/radar.c | 10 +++++++--- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/aweather-gui.c b/src/aweather-gui.c index fcaf87c..b59aa0c 100644 --- a/src/aweather-gui.c +++ b/src/aweather-gui.c @@ -667,16 +667,19 @@ static void aweather_gui_dispose(GObject *_self) g_debug("AWeatherGui: dispose"); AWeatherGui *self = AWEATHER_GUI(_self); if (self->plugins) { - grits_plugins_free(self->plugins); + GritsPlugins *plugins = self->plugins; self->plugins = NULL; + grits_plugins_free(plugins); } if (self->builder) { - g_object_unref(self->builder); + GtkBuilder *builder = self->builder; self->builder = NULL; + g_object_unref(builder); } if (self->prefs) { - g_object_unref(self->prefs); + GritsPrefs *prefs = self->prefs; self->prefs = NULL; + g_object_unref(prefs); } G_OBJECT_CLASS(aweather_gui_parent_class)->dispose(_self); } diff --git a/src/plugins/gps-plugin.c b/src/plugins/gps-plugin.c index befb40e..977fcb7 100644 --- a/src/plugins/gps-plugin.c +++ b/src/plugins/gps-plugin.c @@ -854,19 +854,16 @@ static gint initialize_gpsd(char *server, gchar *port, struct gps_data_t *gps_da #if GPSD_API_MAJOR_VERSION < 5 #error "GPSD protocol version 5 or greater required." #endif - gint result; - - if ((result = gps_open(server, port, gps_data)) != 0) { + gint result = gps_open(server, port, gps_data); + if (result > 0) { g_warning("Unable to open gpsd connection to %s:%s: %d, %d, %s", - server, port, result, errno, gps_errstr(errno)); - } else { - (void)gps_stream(gps_data, WATCH_ENABLE|WATCH_JSON, NULL); - g_debug("GritsPluginGps: initialize_gpsd - gpsd fd %u.", - gps_data->gps_fd); - gdk_input_add(gps_data->gps_fd, GDK_INPUT_READ, process_gps, gps_data); + server, port, result, errno, gps_errstr(errno)); + return 0; } - return result; + (void)gps_stream(gps_data, WATCH_ENABLE|WATCH_JSON, NULL); + g_debug("GritsPluginGps: initialize_gpsd - gpsd fd %u.", gps_data->gps_fd); + return gdk_input_add(gps_data->gps_fd, GDK_INPUT_READ, process_gps, gps_data); } @@ -883,7 +880,7 @@ GritsPluginGps *grits_plugin_gps_new(GritsViewer *viewer, GritsPrefs *prefs) gps->viewer = g_object_ref(viewer); gps->prefs = g_object_ref(prefs); - initialize_gpsd("localhost", DEFAULT_GPSD_PORT, &gps->gps_data); + gps->input_tag = initialize_gpsd("localhost", DEFAULT_GPSD_PORT, &gps->gps_data); gps->follow_gps = FALSE; gps_track_init(&gps->track); @@ -926,6 +923,18 @@ static void grits_plugin_gps_dispose(GObject *gobject) g_debug("GritsPluginGps: dispose"); + if (gps->gps_update_timeout_id) { + g_source_remove(gps->gps_update_timeout_id); + gps->gps_update_timeout_id = 0; + } + if (gps->ui.gps_log_timeout_id) { + g_source_remove(gps->ui.gps_log_timeout_id); + gps->ui.gps_log_timeout_id = 0; + } + if (gps->input_tag) { + gdk_input_remove(gps->input_tag); + gps->input_tag = 0; + } if (gps->viewer) { GritsViewer *viewer = gps->viewer; gps->viewer = NULL; diff --git a/src/plugins/gps-plugin.h b/src/plugins/gps-plugin.h index c9734dd..2bf4585 100644 --- a/src/plugins/gps-plugin.h +++ b/src/plugins/gps-plugin.h @@ -78,6 +78,7 @@ struct _GritsPluginGps { gboolean follow_gps; guint gps_update_timeout_id; /* id of timeout so we can delete it */ + gint input_tag; GpsTrack track; GpsUi ui; diff --git a/src/plugins/radar.c b/src/plugins/radar.c index d9b322f..94b18c6 100644 --- a/src/plugins/radar.c +++ b/src/plugins/radar.c @@ -777,9 +777,13 @@ static void grits_plugin_radar_dispose(GObject *gobject) { g_debug("GritsPluginRadar: dispose"); GritsPluginRadar *self = GRITS_PLUGIN_RADAR(gobject); - g_signal_handler_disconnect(self->config, self->tab_id); - grits_viewer_remove(self->viewer, GRITS_OBJECT(self->hud)); - radar_conus_free(self->conus); + if (self->viewer) { + GritsViewer *viewer = self->viewer; + self->viewer = NULL; + g_signal_handler_disconnect(self->config, self->tab_id); + grits_viewer_remove(viewer, GRITS_OBJECT(self->hud)); + radar_conus_free(self->conus); + } /* Drop references */ G_OBJECT_CLASS(grits_plugin_radar_parent_class)->dispose(gobject); } -- 2.43.2