]> Pileus Git - aweather/commitdiff
fixing more memory leaks
authorAndy Spencer <andy753421@gmail.com>
Fri, 15 May 2009 04:12:16 +0000 (04:12 +0000)
committerAndy Spencer <andy753421@gmail.com>
Fri, 15 May 2009 04:12:16 +0000 (04:12 +0000)
src/Makefile.am
src/aweather-gui.c
src/aweather-view.c
src/data.c
src/plugin-radar.c
src/plugin-ridge.c

index a47ed55150534704b6832b5d0216c29fd18ac903..8611e504e5a6fb3a983abe66d2d5894fca81e617 100644 (file)
@@ -27,3 +27,13 @@ gdb: all
 
 ddd: all
        ddd ./aweather
+
+memcheck:
+       G_SLICE=always-malloc                   \
+       G_DEBUG=gc-friendly,resident-modules    \
+       valgrind --leak-check=full              \
+                --leak-resolution=high         \
+                --num-callers=50               \
+                --suppressions=gtk.suppression \
+                ./aweather                     \
+       2> memcheck.log
index da65a8a8e0be8b02ab3d51883d9dcb88b6579a54..2c7b5c163d7f4c44c558c0e405e9bb8f5b0566c0 100644 (file)
@@ -46,6 +46,7 @@ void on_site_changed(GtkComboBox *combo, AWeatherGui *gui)
        gtk_tree_model_get(model, &iter, 1, &site, -1);
        AWeatherView *view = aweather_gui_get_view(gui);
        aweather_view_set_location(view, site);
+       g_free(site);
 }
 
 void on_time_changed(GtkTreeView *view, GtkTreePath *path,
@@ -58,6 +59,7 @@ void on_time_changed(GtkTreeView *view, GtkTreePath *path,
        gtk_tree_model_get(model, &iter, 0, &time, -1);
        AWeatherView *aview = aweather_gui_get_view(gui);
        aweather_view_set_time(aview, time);
+       g_free(time);
 }
 
 static gboolean map(GtkWidget *da, GdkEventConfigure *event, AWeatherGui *gui)
@@ -145,8 +147,11 @@ static void update_time_widget(AWeatherView *view, char *time, AWeatherGui *gui)
                        gtk_tree_view_set_cursor(tview, path, NULL, FALSE);
                        g_signal_handlers_unblock_by_func(tview,
                                        G_CALLBACK(on_site_changed), gui);
+                       gtk_tree_path_free(path);
+                       g_free(text);
                        return;
                }
+               g_free(text);
        }
 }
 static void update_location_widget(AWeatherView *view, char *location, AWeatherGui *gui)
@@ -163,7 +168,6 @@ static void update_location_widget(AWeatherView *view, char *location, AWeatherG
                        char *text;
                        gtk_tree_model_get(model, &iter2, 1, &text, -1);
                        if (g_str_equal(text, location)) {
-                               GtkTreePath *path = gtk_tree_model_get_path(model, &iter2);
                                g_signal_handlers_block_by_func(combo,
                                                G_CALLBACK(on_site_changed), gui);
                                gtk_combo_box_set_active_iter(combo, &iter2);
@@ -210,6 +214,8 @@ static void site_setup(AWeatherGui *gui)
        gtk_combo_box_set_model(GTK_COMBO_BOX(combo), GTK_TREE_MODEL(store));
        gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(combo), renderer,
                        combo_sensitive, NULL, NULL);
+       g_object_unref(renderer);
+       g_object_unref(store);
 
        g_signal_connect(combo, "changed", G_CALLBACK(on_site_changed),  gui);
        AWeatherView *aview = aweather_gui_get_view(gui);
index af83c4b7f14ebf537fd12e689bf93c97fef3d943..5cf3534bd41aeb49c69922d8d240ff03bed83267 100644 (file)
@@ -148,6 +148,7 @@ void aweather_view_set_time(AWeatherView *view, const char *time)
 {
        g_assert(AWEATHER_IS_VIEW(view));
        //g_message("aweather_view:set_time: setting time to %s", time);
+       g_free(view->time);
        view->time = g_strdup(time);
        g_signal_emit(view, signals[SIG_TIME_CHANGED], 0, time);
 }
index 06c9fbb177e8b11ae0279707dc1417d8e32de10b..e4f2a8ce265bbfa0ea2f7dad2b1507d0770c047e 100644 (file)
 
 typedef struct {
        AWeatherCacheDoneCallback callback;
-       gchar *src;
-       gchar *dst;
+       gchar *url;
+       gchar *local;
+       GFile *src;
+       GFile *dst;
        gchar *user_data;
 } cache_file_end_t;
 
@@ -35,12 +37,15 @@ static void cache_file_cb(GObject *source_object, GAsyncResult *res, gpointer _i
        g_file_copy_finish(G_FILE(source_object), res, &error);
        if (error) {
                g_message("error copying file ([%s]->[%s]): %s",
-                       info->src, info->dst, error->message);
+                       info->url, info->local, error->message);
+               g_error_free(error);
        } else {
-               info->callback(info->dst, info->user_data);
+               info->callback(info->local, info->user_data);
        }
-       g_free(info->src);
-       g_free(info->dst);
+       g_object_unref(info->src);
+       g_object_unref(info->dst);
+       g_free(info->url);
+       g_free(info->local);
        g_free(info);
 }
 
@@ -49,9 +54,14 @@ static goffset g_file_get_size(GFile *file)
        GError *error = NULL;
        GFileInfo *info = g_file_query_info(file,
                        G_FILE_ATTRIBUTE_STANDARD_SIZE, 0, NULL, &error);
-       if (error)
+       if (error){
                g_warning("unable to get file size: %s", error->message);
-       return g_file_info_get_size(info);
+               g_error_free(error);
+       }
+       goffset size = g_file_info_get_size(info);
+       g_file_info_remove_attribute(info, G_FILE_ATTRIBUTE_STANDARD_SIZE);
+       g_object_unref(info);
+       return size;
 }
 
 /**
@@ -63,8 +73,8 @@ void cache_file(char *base, char *path, AWeatherCacheDoneCallback callback, gpoi
 {
        gchar *url   = g_strconcat(base, path, NULL);
        gchar *local = g_build_filename(g_get_user_cache_dir(), PACKAGE, path, NULL);
-       GFile *src = g_file_new_for_uri(url);
-       GFile *dst = g_file_new_for_path(local);
+       GFile *src   = g_file_new_for_uri(url);
+       GFile *dst   = g_file_new_for_path(local);
 
        if (!g_file_test(local, G_FILE_TEST_EXISTS))
                g_message("Caching file: local does not exist - %s", local);
@@ -73,6 +83,8 @@ void cache_file(char *base, char *path, AWeatherCacheDoneCallback callback, gpoi
                                g_file_get_size(src), g_file_get_size(dst));
        else {
                callback(local, user_data);
+               g_object_unref(src);
+               g_object_unref(dst);
                g_free(local);
                g_free(url);
                return;
@@ -84,8 +96,10 @@ void cache_file(char *base, char *path, AWeatherCacheDoneCallback callback, gpoi
        g_free(dir);
        cache_file_end_t *info = g_malloc0(sizeof(cache_file_end_t));
        info->callback  = callback;
-       info->src       = url;
-       info->dst       = local;
+       info->url       = url;
+       info->local     = local;
+       info->src       = src;
+       info->dst       = dst;
        info->user_data = user_data;
        g_file_copy_async(src, dst,
                G_FILE_COPY_OVERWRITE, // GFileCopyFlags flags,
index dbf71957fd796c45d6036e5a7e38cba1004759a8..4e4376de7818888c8eb2f4443cf50c6090849de1 100644 (file)
@@ -93,6 +93,7 @@ static void load_sweep(Sweep *sweep)
        int height, width;
        guint8 *data;
        bscan_sweep(sweep, &data, &width, &height);
+       glDeleteTextures(1, &sweep_tex);
        glGenTextures(1, &sweep_tex);
        glBindTexture(GL_TEXTURE_2D, sweep_tex);
        glPixelStorei(GL_PACK_ALIGNMENT, 1);
@@ -121,7 +122,7 @@ static void load_radar_gui(Radar *radar)
                Volume *vol = radar->v[vi];
                if (vol == NULL) continue;
                GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
-               for (si = vol->h.nsweeps-1; si >= 0; si--) {
+               for (si = 0; si < vol->h.nsweeps; si++) {
                        Sweep *sweep = vol->sweep[si];
                        if (sweep == NULL) continue;
                        char *label = g_strdup_printf("Tilt: %.2f (%s)",
@@ -150,7 +151,9 @@ static void load_radar_rsl(GPid pid, gint status, gpointer _path)
                g_warning("wsr88ddec exited with status %d", status);
                return;
        }
-       char *site = g_path_get_basename(g_path_get_dirname(path));
+       char *dir  = g_path_get_dirname(path);
+       char *site = g_path_get_basename(dir);
+       g_free(dir);
        RSL_read_these_sweeps("all", NULL);
        if (radar) {
                g_message("Freeing radar");
@@ -160,8 +163,12 @@ static void load_radar_rsl(GPid pid, gint status, gpointer _path)
        radar = RSL_wsr88d_to_radar(path, site);
        if (radar == NULL) {
                g_warning("fail to load radar: path=%s, site=%s", path, site);
+               g_free(path);
+               g_free(site);
                return;
        }
+       g_free(path);
+       g_free(site);
 
        /* Load the first sweep by default */
        if (radar->h.nvolumes < 1 || radar->v[0]->h.nsweeps < 1) {
@@ -204,9 +211,11 @@ static void load_radar(char *path, gpointer user_data)
                        NULL,    // gpointer user_data,
                        &pid,    // GPid *child_pid,
                        &error); // GError **error
-               if (error)
+               if (error) {
                        g_warning("failed to decompress WSR88D data: %s",
                                        error->message);
+                       g_error_free(error);
+               }
                g_child_watch_add(pid, load_radar_rsl, raw);
        }
 }
@@ -307,19 +316,23 @@ static void set_time(AWeatherView *view, char *time, gpointer user_data)
 static void set_site(AWeatherView *view, char *site, gpointer user_data)
 {
        g_message("Loading wsr88d list for %s", site);
-       gchar *data;
-       gsize length;
-       GError *error = NULL;
+       cur_sweep = NULL; // Clear radar
+
        char *list_uri = g_strdup_printf(
                        "http://mesonet.agron.iastate.edu/data/nexrd2/raw/K%s/dir.list",
                        site);
        GFile *list    = g_file_new_for_uri(list_uri);
        g_free(list_uri);
-       cur_sweep = NULL; // Clear radar
+
+       gchar *data;
+       gsize length;
+       GError *error = NULL;
        gtk_widget_queue_draw(aweather_gui_get_widget(gui, "drawing"));
        g_file_load_contents(list, NULL, &data, &length, NULL, &error);
+       g_object_unref(list);
        if (error) {
                g_warning("Error loading list for %s: %s", site, error->message);
+               g_error_free(error);
                return;
        }
        gchar **lines = g_strsplit(data, "\n", -1);
@@ -327,18 +340,20 @@ static void set_site(AWeatherView *view, char *site, gpointer user_data)
        GtkListStore *lstore = GTK_LIST_STORE(gtk_tree_view_get_model(tview));
        gtk_list_store_clear(lstore);
        radar = NULL;
-       char *time = NULL;
+       GtkTreeIter iter;
        for (int i = 0; lines[i] && lines[i][0]; i++) {
                // format: `841907 KABR_20090510_0159'
                //g_message("\tadding %p [%s]", lines[i], lines[i]);
                char **parts = g_strsplit(lines[i], " ", 2);
-               time = parts[1]+5;
-               GtkTreeIter iter;
+               char *time = parts[1]+5;
                gtk_list_store_insert(lstore, &iter, 0);
                gtk_list_store_set(lstore, &iter, 0, time, -1);
+               g_strfreev(parts);
        }
-       if (time != NULL) 
-               aweather_view_set_time(view, time);
+       char *time = NULL;
+       gtk_tree_model_get(GTK_TREE_MODEL(lstore), &iter, 0, &time, -1);
+       aweather_view_set_time(view, time);
+       g_free(time);
        g_free(data);
        g_strfreev(lines);
 }
index 9ab037f235174bd9a8498c734623f8423d3bbf92..77bffe93a488a0c54876a02e610f00efadd656f7 100644 (file)
@@ -72,6 +72,7 @@ void load_texture(gchar *filename, gpointer _layer)
        int        format = gdk_pixbuf_get_has_alpha(pixbuf) ? GL_RGBA : GL_RGB;
 
        /* Create Texture */
+       glDeleteTextures(1, &layer->tex);
        glGenTextures(1, &layer->tex);
        glBindTexture(GL_TEXTURE_2D, layer->tex); // 2d texture (x and y size)
 
@@ -89,6 +90,8 @@ void load_texture(gchar *filename, gpointer _layer)
 
        aweather_gui_gl_end(gui);
 
+       g_object_unref(pixbuf);
+
        /* Redraw */
        gtk_widget_queue_draw(aweather_gui_get_widget(gui, "drawing"));
 }