From 472b8362101f7d2712a32a30af3c4fd7b5637aa4 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Fri, 15 May 2009 04:12:16 +0000 Subject: [PATCH] fixing more memory leaks --- src/Makefile.am | 10 ++++++++++ src/aweather-gui.c | 8 +++++++- src/aweather-view.c | 1 + src/data.c | 38 ++++++++++++++++++++++++++------------ src/plugin-radar.c | 39 +++++++++++++++++++++++++++------------ src/plugin-ridge.c | 3 +++ 6 files changed, 74 insertions(+), 25 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index a47ed55..8611e50 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 diff --git a/src/aweather-gui.c b/src/aweather-gui.c index da65a8a..2c7b5c1 100644 --- a/src/aweather-gui.c +++ b/src/aweather-gui.c @@ -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); diff --git a/src/aweather-view.c b/src/aweather-view.c index af83c4b..5cf3534 100644 --- a/src/aweather-view.c +++ b/src/aweather-view.c @@ -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); } diff --git a/src/data.c b/src/data.c index 06c9fbb..e4f2a8c 100644 --- a/src/data.c +++ b/src/data.c @@ -23,8 +23,10 @@ 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, diff --git a/src/plugin-radar.c b/src/plugin-radar.c index dbf7195..4e4376d 100644 --- a/src/plugin-radar.c +++ b/src/plugin-radar.c @@ -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); } diff --git a/src/plugin-ridge.c b/src/plugin-ridge.c index 9ab037f..77bffe9 100644 --- a/src/plugin-ridge.c +++ b/src/plugin-ridge.c @@ -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")); } -- 2.43.2