]> Pileus Git - aweather/commitdiff
Improve shutdown code
authorAndy Spencer <andy753421@gmail.com>
Sat, 11 Feb 2012 21:00:00 +0000 (21:00 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sun, 12 Feb 2012 07:05:42 +0000 (07:05 +0000)
- Make dispose functions reentrant
- Remove idle function from GPS plugin
- Remove GPSd input from GPS plugin

src/aweather-gui.c
src/plugins/gps-plugin.c
src/plugins/gps-plugin.h
src/plugins/radar.c

index fcaf87c71ab2857d845990d00c677a780aabf357..b59aa0caf516bdf20ea2c1d55b09bb7658913c06 100644 (file)
@@ -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);
 }
index befb40ecb23184088a061d8146d453b5a6a35659..977fcb722f7491587f6a2ac0361b3e56bb7fe123 100644 (file)
@@ -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;
index c9734dd50fe3bdcae36012c837e38a34391bd5a7..2bf45852e8dec4c9aed15ad07ad47682986a2679 100644 (file)
@@ -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;
index d9b322ffbefe9804bd8338c6861f1239f5739e04..94b18c6cbc613e602ba9d0f75af196b67f5f9733 100644 (file)
@@ -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);
 }