From b616e892ca4fc63547ff9a712ea3bc1fed8b87e5 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 24 Oct 2008 04:04:42 +0000 Subject: [PATCH] =?UTF-8?q?Bug=20556910=20=E2=80=93=20[fam-helper.c:223]:?= =?UTF-8?q?=20Memory=20leak:=20sub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2008-10-24 Matthias Clasen Bug 556910 – [fam-helper.c:223]: Memory leak: sub * fam/fam-helper.c: Fix a memory leak and formatting issues. Reported by Daniel Marjamäki svn path=/trunk/; revision=7624 --- gio/ChangeLog | 7 ++ gio/fam/fam-helper.c | 206 +++++++++++++++++++++++-------------------- 2 files changed, 115 insertions(+), 98 deletions(-) diff --git a/gio/ChangeLog b/gio/ChangeLog index 059a6f5ec..fae39c14c 100644 --- a/gio/ChangeLog +++ b/gio/ChangeLog @@ -1,3 +1,10 @@ +2008-10-24 Matthias Clasen + + Bug 556910 – [fam-helper.c:223]: Memory leak: sub + + * fam/fam-helper.c: Fix a memory leak and formatting issues. + Reported by Daniel Marjamäki + 2008-10-23 Matthias Clasen * gdesktopappinfo.c (g_app_info_reset_type_associations): Fix docs. diff --git a/gio/fam/fam-helper.c b/gio/fam/fam-helper.c index 2dafa80ce..840c49744 100644 --- a/gio/fam/fam-helper.c +++ b/gio/fam/fam-helper.c @@ -70,76 +70,80 @@ fam_event_to_file_monitor_event (int code) static gboolean fam_do_iter_unlocked (void) { - while (fam_connection != NULL && FAMPending (fam_connection)) { - FAMEvent ev; - fam_sub* sub = NULL; - gboolean cancelled; + while (fam_connection != NULL && FAMPending (fam_connection)) + { + FAMEvent ev; + fam_sub* sub = NULL; + gboolean cancelled; - if (FAMNextEvent (fam_connection, &ev) != 1) { - FAMClose (fam_connection); - g_free (fam_connection); - g_source_remove (fam_watch_id); - fam_watch_id = 0; - fam_connection = NULL; - return FALSE; - } + if (FAMNextEvent (fam_connection, &ev) != 1) + { + FAMClose (fam_connection); + g_free (fam_connection); + g_source_remove (fam_watch_id); + fam_watch_id = 0; + fam_connection = NULL; + return FALSE; + } - sub = (fam_sub*)ev.userdata; - cancelled = sub->cancelled; - if (ev.code == FAMAcknowledge && cancelled) - { - _fam_sub_free (sub); - continue; - } - - if (cancelled) - continue; - - if (sub->directory) - { - GFileMonitor* monitor = G_FILE_MONITOR (sub->user_data); - GFileMonitorEvent eflags = fam_event_to_file_monitor_event (ev.code); - gchar* path = NULL; - GFile *child, *parent; - - /* unsupported event */ - if (eflags == -1) + sub = (fam_sub*)ev.userdata; + cancelled = sub->cancelled; + if (ev.code == FAMAcknowledge && cancelled) + { + _fam_sub_free (sub); continue; + } + + if (cancelled) + continue; + + if (sub->directory) + { + GFileMonitor* monitor = G_FILE_MONITOR (sub->user_data); + GFileMonitorEvent eflags = fam_event_to_file_monitor_event (ev.code); + gchar* path = NULL; + GFile *child, *parent; - if (ev.filename[0] == '/') - path = g_strdup (ev.filename); - else - path = g_strdup_printf ("%s/%s", sub->pathname, ev.filename); + /* unsupported event */ + if (eflags == -1) + continue; + + if (ev.filename[0] == '/') + path = g_strdup (ev.filename); + else + path = g_strdup_printf ("%s/%s", sub->pathname, ev.filename); - child = g_file_new_for_path (path); - parent = g_file_get_parent (child); - g_file_monitor_emit_event (monitor, child, NULL, eflags); - g_free (path); - g_object_unref (child); - g_object_unref (parent); - } else { - GFile *child; - GFileMonitor* monitor = G_FILE_MONITOR (sub->user_data); - GFileMonitorEvent eflags = fam_event_to_file_monitor_event (ev.code); - gchar* path = NULL; + child = g_file_new_for_path (path); + parent = g_file_get_parent (child); + g_file_monitor_emit_event (monitor, child, NULL, eflags); + g_free (path); + g_object_unref (child); + g_object_unref (parent); + } + else + { + GFile *child; + GFileMonitor* monitor = G_FILE_MONITOR (sub->user_data); + GFileMonitorEvent eflags = fam_event_to_file_monitor_event (ev.code); + gchar* path = NULL; - if (eflags == -1) - continue; - path = g_strdup (ev.filename); - child = g_file_new_for_path (path); - g_file_monitor_emit_event (monitor, child, NULL, eflags); - g_free (path); - g_object_unref (child); - } - } + if (eflags == -1) + continue; + path = g_strdup (ev.filename); + child = g_file_new_for_path (path); + g_file_monitor_emit_event (monitor, child, NULL, eflags); + g_free (path); + g_object_unref (child); + } + } return TRUE; } static gboolean -fam_callback (GIOChannel *source, - GIOCondition condition, - gpointer data) +fam_callback (GIOChannel *source, + GIOCondition condition, + gpointer data) { gboolean res; G_LOCK (fam_connection); @@ -157,25 +161,27 @@ _fam_sub_startup (void) G_LOCK (fam_connection); - if (fam_connection == NULL) { - fam_connection = g_new0 (FAMConnection, 1); - if (FAMOpen2 (fam_connection, "gvfs user") != 0) { - g_warning ("FAMOpen failed, FAMErrno=%d\n", FAMErrno); - g_free (fam_connection); - fam_connection = NULL; - G_UNLOCK (fam_connection); - return FALSE; - } + if (fam_connection == NULL) + { + fam_connection = g_new0 (FAMConnection, 1); + if (FAMOpen2 (fam_connection, "gvfs user") != 0) + { + g_warning ("FAMOpen failed, FAMErrno=%d\n", FAMErrno); + g_free (fam_connection); + fam_connection = NULL; + G_UNLOCK (fam_connection); + return FALSE; + } #ifdef HAVE_FAM_NO_EXISTS /* This is a gamin extension that avoids sending all the Exists event for dir monitors */ - FAMNoExists (fam_connection); + FAMNoExists (fam_connection); #endif - ioc = g_io_channel_unix_new (FAMCONNECTION_GETFD(fam_connection)); - fam_watch_id = g_io_add_watch (ioc, - G_IO_IN | G_IO_HUP | G_IO_ERR, - fam_callback, fam_connection); - g_io_channel_unref (ioc); - } + ioc = g_io_channel_unix_new (FAMCONNECTION_GETFD(fam_connection)); + fam_watch_id = g_io_add_watch (ioc, + G_IO_IN | G_IO_HUP | G_IO_ERR, + fam_callback, fam_connection); + g_io_channel_unref (ioc); + } G_UNLOCK (fam_connection); @@ -187,41 +193,43 @@ _fam_sub_shutdown (void) { G_LOCK (fam_connection); - if (fam_connection != NULL) { - FAMClose (fam_connection); - g_free (fam_connection); - g_source_remove (fam_watch_id); - fam_watch_id = 0; - fam_connection = NULL; - } + if (fam_connection != NULL) + { + FAMClose (fam_connection); + g_free (fam_connection); + g_source_remove (fam_watch_id); + fam_watch_id = 0; + fam_connection = NULL; + } G_UNLOCK (fam_connection); } fam_sub* -_fam_sub_add (const gchar* pathname, - gboolean directory, - gpointer user_data) +_fam_sub_add (const gchar *pathname, + gboolean directory, + gpointer user_data) { fam_sub *sub; if (!_fam_sub_startup ()) return NULL; - sub = g_new0 (fam_sub, 1); - sub->pathname = g_strdup (pathname); - sub->directory = directory; - sub->user_data = user_data; - G_LOCK (fam_connection); /* We need to queue up incoming messages to avoid blocking on write * if there are many monitors being canceled */ fam_do_iter_unlocked (); - if (fam_connection == NULL) { - G_UNLOCK (fam_connection); - return NULL; - } + if (fam_connection == NULL) + { + G_UNLOCK (fam_connection); + return NULL; + } + + sub = g_new0 (fam_sub, 1); + sub->pathname = g_strdup (pathname); + sub->directory = directory; + sub->user_data = user_data; if (directory) FAMMonitorDirectory (fam_connection, pathname, &sub->request, sub); @@ -229,6 +237,7 @@ _fam_sub_add (const gchar* pathname, FAMMonitorFile (fam_connection, pathname, &sub->request, sub); G_UNLOCK (fam_connection); + return sub; } @@ -245,10 +254,11 @@ _fam_sub_cancel (fam_sub* sub) * if there are many monitors being canceled */ fam_do_iter_unlocked (); - if (fam_connection == NULL) { - G_UNLOCK (fam_connection); - return FALSE; - } + if (fam_connection == NULL) + { + G_UNLOCK (fam_connection); + return FALSE; + } FAMCancelMonitor (fam_connection, &sub->request);