glib r7624 - in trunk/gio: . fam
- From: matthiasc svn gnome org
- To: svn-commits-list gnome org
- Subject: glib r7624 - in trunk/gio: . fam
- Date: Fri, 24 Oct 2008 04:04:42 +0000 (UTC)
Author: matthiasc
Date: Fri Oct 24 04:04:42 2008
New Revision: 7624
URL: http://svn.gnome.org/viewvc/glib?rev=7624&view=rev
Log:
2008-10-24 Matthias Clasen <mclasen redhat com>
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
Modified:
trunk/gio/ChangeLog
trunk/gio/fam/fam-helper.c
Modified: trunk/gio/fam/fam-helper.c
==============================================================================
--- trunk/gio/fam/fam-helper.c (original)
+++ trunk/gio/fam/fam-helper.c Fri Oct 24 04:04:42 2008
@@ -70,76 +70,80 @@
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;
- }
+ sub = (fam_sub*)ev.userdata;
+ cancelled = sub->cancelled;
+ if (ev.code == FAMAcknowledge && cancelled)
+ {
+ _fam_sub_free (sub);
+ continue;
+ }
- if (cancelled)
- 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 (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)
- continue;
+ /* 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;
+ 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;
- 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 @@
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 @@
{
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 @@
FAMMonitorFile (fam_connection, pathname, &sub->request, sub);
G_UNLOCK (fam_connection);
+
return sub;
}
@@ -245,10 +254,11 @@
* 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]