[gnome-menus] patch to latest git, fixes some memory leak and crash issues

Adam Williamson adamwill at fedoraproject.org
Wed Jan 8 23:27:47 UTC 2014


commit 424514fd65433b5f3d5bea179b662644f89f6661
Author: Adam Williamson <awilliam at redhat.com>
Date:   Wed Jan 8 15:27:44 2014 -0800

    patch to latest git, fixes some memory leak and crash issues

 gnome-menus-3.10.1-git94ba6e23c0.patch |  442 ++++++++++++++++++++++++++++++++
 gnome-menus.spec                       |    8 +-
 2 files changed, 449 insertions(+), 1 deletions(-)
---
diff --git a/gnome-menus-3.10.1-git94ba6e23c0.patch b/gnome-menus-3.10.1-git94ba6e23c0.patch
new file mode 100644
index 0000000..c748e26
--- /dev/null
+++ b/gnome-menus-3.10.1-git94ba6e23c0.patch
@@ -0,0 +1,442 @@
+diff --git a/libmenu/desktop-entries.c b/libmenu/desktop-entries.c
+index 1e23bf2..a8c13d9 100644
+--- a/libmenu/desktop-entries.c
++++ b/libmenu/desktop-entries.c
+@@ -406,7 +406,7 @@ desktop_entry_ref (DesktopEntry *entry)
+   g_return_val_if_fail (entry != NULL, NULL);
+   g_return_val_if_fail (entry->refcount > 0, NULL);
+ 
+-  g_atomic_int_inc (&entry->refcount);
++  entry->refcount += 1;
+ 
+   return entry;
+ }
+@@ -699,7 +699,7 @@ desktop_entry_set_ref (DesktopEntrySet *set)
+   g_return_val_if_fail (set != NULL, NULL);
+   g_return_val_if_fail (set->refcount > 0, NULL);
+ 
+-  g_atomic_int_inc (&set->refcount);
++  set->refcount += 1;
+ 
+   return set;
+ }
+@@ -707,13 +707,11 @@ desktop_entry_set_ref (DesktopEntrySet *set)
+ void
+ desktop_entry_set_unref (DesktopEntrySet *set)
+ {
+-  gboolean is_zero;
+-
+   g_return_if_fail (set != NULL);
+   g_return_if_fail (set->refcount > 0);
+ 
+-  is_zero = g_atomic_int_dec_and_test (&set->refcount);
+-  if (is_zero)
++  set->refcount -= 1;
++  if (set->refcount == 0)
+     {
+       menu_verbose (" Deleting entry set %p\n", set);
+ 
+diff --git a/libmenu/entry-directories.c b/libmenu/entry-directories.c
+index 67869b4..c827f84 100644
+--- a/libmenu/entry-directories.c
++++ b/libmenu/entry-directories.c
+@@ -40,12 +40,12 @@ struct EntryDirectory
+ 
+   guint entry_type : 2;
+   guint is_legacy : 1;
+-  volatile gint refcount;
++  guint refcount : 24;
+ };
+ 
+ struct EntryDirectoryList
+ {
+-  volatile int refcount;
++  int    refcount;
+   int    length;
+   GList *dirs;
+ };
+@@ -64,10 +64,10 @@ struct CachedDir
+   guint have_read_entries : 1;
+   guint deleted : 1;
+ 
++  guint references;
++
+   GFunc    notify;
+   gpointer notify_data;
+-
+-  volatile gint references;
+ };
+ 
+ struct CachedDirMonitor
+@@ -83,6 +83,7 @@ static void     cached_dir_free                   (CachedDir  *dir);
+ static gboolean cached_dir_load_entries_recursive (CachedDir  *dir,
+                                                    const char *dirname);
+ static void     cached_dir_unref                  (CachedDir *dir);
++static void     cached_dir_unref_noparent         (CachedDir *dir);
+ static CachedDir * cached_dir_add_subdir          (CachedDir  *dir,
+                                                    const char *basename,
+                                                    const char *path);
+@@ -156,7 +157,7 @@ cached_dir_free (CachedDir *dir)
+   dir->entries = NULL;
+ 
+   g_slist_foreach (dir->subdirs,
+-                   (GFunc) cached_dir_unref,
++                   (GFunc) cached_dir_unref_noparent,
+                    NULL);
+   g_slist_free (dir->subdirs);
+   dir->subdirs = NULL;
+@@ -168,18 +169,14 @@ cached_dir_free (CachedDir *dir)
+ static CachedDir *
+ cached_dir_ref (CachedDir *dir)
+ {
+-  g_atomic_int_inc (&dir->references);
+-
++  dir->references++;
+   return dir;
+ }
+ 
+ static void
+ cached_dir_unref (CachedDir *dir)
+ {
+-  gboolean is_zero;
+-
+-  is_zero = g_atomic_int_dec_and_test (&dir->references);
+-  if (is_zero)
++  if (--dir->references == 0)
+     {
+       CachedDir *parent;
+ 
+@@ -195,6 +192,18 @@ cached_dir_unref (CachedDir *dir)
+     }
+ }
+ 
++static void
++cached_dir_unref_noparent (CachedDir *dir)
++{
++  if (--dir->references == 0)
++    {
++      if (dir->notify)
++        dir->notify (dir, dir->notify_data);
++
++      cached_dir_free (dir);
++    }
++}
++
+ static inline CachedDir *
+ find_subdir (CachedDir  *dir,
+              const char *subdir)
+@@ -224,13 +233,8 @@ find_entry (CachedDir  *dir,
+   tmp = dir->entries;
+   while (tmp != NULL)
+     {
+-      const char *entry_basename;
+-
+-      entry_basename = desktop_entry_get_basename (tmp->data);
+-      if (strcmp (entry_basename, basename) == 0)
+-        {
+-          return tmp->data;
+-        }
++      if (strcmp (desktop_entry_get_basename (tmp->data), basename) == 0)
++        return tmp->data;
+ 
+       tmp = tmp->next;
+     }
+@@ -334,9 +338,7 @@ cached_dir_update_entry (CachedDir  *dir,
+   tmp = dir->entries;
+   while (tmp != NULL)
+     {
+-      const char *entry_basename;
+-      entry_basename = desktop_entry_get_basename (tmp->data);
+-      if (strcmp (entry_basename, basename) == 0)
++      if (strcmp (desktop_entry_get_basename (tmp->data), basename) == 0)
+         {
+           if (!desktop_entry_reload (tmp->data))
+ 	    {
+@@ -361,10 +363,7 @@ cached_dir_remove_entry (CachedDir  *dir,
+   tmp = dir->entries;
+   while (tmp != NULL)
+     {
+-      const char *entry_basename;
+-      entry_basename = desktop_entry_get_basename (tmp->data);
+-
+-      if (strcmp (entry_basename, basename) == 0)
++      if (strcmp (desktop_entry_get_basename (tmp->data), basename) == 0)
+         {
+           desktop_entry_unref (tmp->data);
+           dir->entries = g_slist_delete_link (dir->entries, tmp);
+@@ -420,11 +419,8 @@ cached_dir_remove_subdir (CachedDir  *dir,
+     {
+       subdir->deleted = TRUE;
+ 
+-      if (subdir->references == 0)
+-        {
+-          cached_dir_unref (subdir);
+-          dir->subdirs = g_slist_remove (dir->subdirs, subdir);
+-        }
++      cached_dir_unref (subdir);
++      dir->subdirs = g_slist_remove (dir->subdirs, subdir);
+ 
+       return TRUE;
+     }
+@@ -528,16 +524,11 @@ handle_cached_dir_changed (MenuMonitor      *monitor,
+   char     *basename;
+   char     *dirname;
+ 
+-  menu_verbose ("'%s' notified of '%s' %s - invalidating cache\n",
+-		dir->name,
+-                path,
+-                event == MENU_MONITOR_EVENT_CREATED ? ("created") :
+-                event == MENU_MONITOR_EVENT_DELETED ? ("deleted") : ("changed"));
+-
+   dirname  = g_path_get_dirname  (path);
+   basename = g_path_get_basename (path);
+ 
+   dir = cached_dir_lookup (dirname);
++  cached_dir_add_reference (dir);
+ 
+   if (g_str_has_suffix (basename, ".desktop") ||
+       g_str_has_suffix (basename, ".directory"))
+@@ -558,7 +549,7 @@ handle_cached_dir_changed (MenuMonitor      *monitor,
+           break;
+         }
+     }
+-  else /* Try recursing */
++  else if (g_file_test (path, G_FILE_TEST_IS_DIR)) /* Try recursing */
+     {
+       switch (event)
+         {
+@@ -584,6 +575,12 @@ handle_cached_dir_changed (MenuMonitor      *monitor,
+ 
+   if (handled)
+     {
++      menu_verbose ("'%s' notified of '%s' %s - invalidating cache\n",
++                    dir->name,
++                    path,
++                    event == MENU_MONITOR_EVENT_CREATED ? ("created") :
++                    event == MENU_MONITOR_EVENT_DELETED ? ("deleted") : ("changed"));
++
+       /* CHANGED events don't change the set of desktop entries */
+       if (event == MENU_MONITOR_EVENT_CREATED || event == MENU_MONITOR_EVENT_DELETED)
+         {
+@@ -592,6 +589,8 @@ handle_cached_dir_changed (MenuMonitor      *monitor,
+ 
+       cached_dir_queue_monitor_event (dir);
+     }
++
++  cached_dir_remove_reference (dir);
+ }
+ 
+ static void
+@@ -822,7 +821,7 @@ entry_directory_ref (EntryDirectory *ed)
+   g_return_val_if_fail (ed != NULL, NULL);
+   g_return_val_if_fail (ed->refcount > 0, NULL);
+ 
+-  g_atomic_int_inc (&ed->refcount);
++  ed->refcount++;
+ 
+   return ed;
+ }
+@@ -830,13 +829,10 @@ entry_directory_ref (EntryDirectory *ed)
+ void
+ entry_directory_unref (EntryDirectory *ed)
+ {
+-  gboolean is_zero;
+-
+   g_return_if_fail (ed != NULL);
+   g_return_if_fail (ed->refcount > 0);
+ 
+-  is_zero = g_atomic_int_dec_and_test (&ed->refcount);
+-  if (is_zero)
++  if (--ed->refcount == 0)
+     {
+       cached_dir_remove_reference (ed->dir);
+ 
+@@ -952,12 +948,11 @@ entry_directory_foreach_recursive (EntryDirectory            *ed,
+ 
+       if (desktop_entry_get_type (entry) == ed->entry_type)
+         {
+-          gboolean    ret;
+-          char       *file_id;
+-          const char *basename;
++          gboolean  ret;
++          char     *file_id;
+ 
+-          basename = desktop_entry_get_basename (entry);
+-          g_string_append (relative_path, basename);
++          g_string_append (relative_path,
++                           desktop_entry_get_basename (entry));
+ 
+ 	  file_id = get_desktop_file_id_from_path (ed,
+ 						   ed->entry_type,
+@@ -1037,7 +1032,7 @@ entry_directory_get_flat_contents (EntryDirectory   *ed,
+       DesktopEntry *entry = tmp->data;
+       const char   *basename;
+ 
+-      basename = desktop_entry_get_path (entry);
++      basename = desktop_entry_get_basename (entry);
+ 
+       if (desktop_entries &&
+           desktop_entry_get_type (entry) == DESKTOP_ENTRY_DESKTOP)
+@@ -1110,7 +1105,7 @@ entry_directory_list_ref (EntryDirectoryList *list)
+   g_return_val_if_fail (list != NULL, NULL);
+   g_return_val_if_fail (list->refcount > 0, NULL);
+ 
+-  g_atomic_int_inc (&list->refcount);
++  list->refcount += 1;
+ 
+   return list;
+ }
+@@ -1118,13 +1113,11 @@ entry_directory_list_ref (EntryDirectoryList *list)
+ void
+ entry_directory_list_unref (EntryDirectoryList *list)
+ {
+-  gboolean is_zero;
+-
+   g_return_if_fail (list != NULL);
+   g_return_if_fail (list->refcount > 0);
+ 
+-  is_zero = g_atomic_int_dec_and_test (&list->refcount);
+-  if (is_zero)
++  list->refcount -= 1;
++  if (list->refcount == 0)
+     {
+       g_list_foreach (list->dirs, (GFunc) entry_directory_unref, NULL);
+       g_list_free (list->dirs);
+diff --git a/libmenu/gmenu-tree.c b/libmenu/gmenu-tree.c
+index 091a719..9aa94c5 100644
+--- a/libmenu/gmenu-tree.c
++++ b/libmenu/gmenu-tree.c
+@@ -1242,12 +1242,8 @@ gmenu_tree_directory_make_path (GMenuTreeDirectory *directory,
+   append_directory_path (directory, path);
+ 
+   if (entry != NULL)
+-    {
+-      const char *basename;
+-
+-      basename = desktop_entry_get_basename (entry->desktop_entry);
+-      g_string_append (path, basename);
+-    }
++    g_string_append (path,
++		     desktop_entry_get_basename (entry->desktop_entry));
+ 
+   return g_string_free (path, FALSE);
+ }
+@@ -1277,7 +1273,7 @@ gmenu_tree_entry_get_desktop_file_path (GMenuTreeEntry *entry)
+ const char *
+ gmenu_tree_entry_get_desktop_file_id (GMenuTreeEntry *entry)
+ {
+-  g_return_val_if_fail (entry != NULL, FALSE);
++  g_return_val_if_fail (entry != NULL, NULL);
+ 
+   return entry->desktop_file_id;
+ }
+diff --git a/po/el.po b/po/el.po
+index e3fcc56..6678cfb 100644
+--- a/po/el.po
++++ b/po/el.po
+@@ -10,16 +10,16 @@ msgstr ""
+ "Project-Id-Version: el\n"
+ "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+ "menus&keywords=I18N+L10N&component=general\n"
+-"POT-Creation-Date: 2013-02-19 22:31+0000\n"
+-"PO-Revision-Date: 2013-02-24 10:21+0300\n"
++"POT-Creation-Date: 2013-12-18 20:58+0000\n"
++"PO-Revision-Date: 2013-12-23 08:45+0300\n"
+ "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32 at gmail.com>\n"
+-"Language-Team: team at gnome.gr\n"
++"Language-Team: team at lists.gnome.gr\n"
+ "Language: el\n"
+ "MIME-Version: 1.0\n"
+ "Content-Type: text/plain; charset=UTF-8\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+-"X-Generator: Virtaal 0.7.1\n"
++"X-Generator: Virtaal 0.7.0\n"
+ "X-Project-Style: gnome\n"
+ 
+ #: ../desktop-directories/AudioVideo.directory.in.h:1
+@@ -117,7 +117,7 @@ msgstr "Διάφορα"
+ 
+ #: ../desktop-directories/X-GNOME-Utilities.directory.in.h:1
+ msgid "Utilities"
+-msgstr "Βοηθήματα"
++msgstr "Βοηθητικά προγράμματα"
+ 
+ #: ../desktop-directories/X-GNOME-Utilities.directory.in.h:2
+ msgid "Small but useful GNOME tools"
+diff --git a/po/fr.po b/po/fr.po
+index 5721f91..e227f32 100644
+--- a/po/fr.po
++++ b/po/fr.po
+@@ -14,7 +14,7 @@ msgstr ""
+ "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+ "menus&keywords=I18N+L10N&component=general\n"
+ "POT-Creation-Date: 2013-02-20 09:33+0000\n"
+-"PO-Revision-Date: 2013-02-20 21:14+0100\n"
++"PO-Revision-Date: 2013-10-23 16:35+0200\n"
+ "Last-Translator: Claude Paroz <claude at 2xlibre.net>\n"
+ "Language-Team: GNOME French team <gnomefr at traduc.org>\n"
+ "Language: \n"
+@@ -72,7 +72,7 @@ msgstr "Bureautique"
+ 
+ #: ../desktop-directories/Office.directory.in.h:2
+ msgid "Office Applications"
+-msgstr "Autres applications"
++msgstr "Applications de bureautique"
+ 
+ #: ../desktop-directories/System-Tools.directory.in.h:1
+ msgid "System Tools"
+diff --git a/po/ml.po b/po/ml.po
+index 3ab08af..bdee38d 100644
+--- a/po/ml.po
++++ b/po/ml.po
+@@ -5,14 +5,15 @@
+ # Ani Peter <peter.ani at gmail.com>, 2006.
+ # Praveen|പ്രവീണ്‍ A|എ <pravi.a at gmail.com>, 2007,2008.
+ # Ani Peter <apeter at redhat.com>, 2007, 2012, 2013.
++# Akhilan <akhilkrishnans at gmail.com, 2013
+ msgid ""
+ msgstr ""
+ "Project-Id-Version: gnome-menus.master.ml\n"
+ "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
+ "menus&keywords=I18N+L10N&component=general\n"
+-"POT-Creation-Date: 2013-03-18 10:33+0000\n"
+-"PO-Revision-Date: 2013-03-25 19:17+0530\n"
+-"Last-Translator: Ani Peter <peter.ani at gmail.com>\n"
++"POT-Creation-Date: 2013-10-23 14:43+0000\n"
++"PO-Revision-Date: 2013-11-03 14:28+0530\n"
++"Last-Translator: Akhilan <akhilkrishnans at gmail.com>\n"
+ "Language-Team: Malayalam <discuss at lists.smc.org.in>\n"
+ "Language: ml\n"
+ "MIME-Version: 1.0\n"
+@@ -27,7 +28,7 @@ msgstr "ശബ്ദവും ചലച്ചിത്രവും"
+ 
+ #: ../desktop-directories/AudioVideo.directory.in.h:2
+ msgid "Multimedia menu"
+-msgstr "മള്‍ട്ടീമീഡിയ മെനു"
++msgstr "മള്‍ട്ടീമീഡിയ ഐച്ഛികം"
+ 
+ #: ../desktop-directories/Development.directory.in.h:1
+ msgid "Programming"
+@@ -95,7 +96,7 @@ msgstr "ഉപകരണങ്ങള്‍"
+ 
+ #: ../desktop-directories/Utility.directory.in.h:2
+ msgid "Desktop accessories"
+-msgstr "പണിയിടോപകരണങ്ങള്‍"
++msgstr "പണിയിട ഉപകരണങ്ങള്‍"
+ 
+ #: ../desktop-directories/X-GNOME-Menu-Applications.directory.in.h:1
+ msgid "Applications"
+diff --git a/util/test-menu-spec.c b/util/test-menu-spec.c
+index c48509e..00ea252 100644
+--- a/util/test-menu-spec.c
++++ b/util/test-menu-spec.c
+@@ -207,8 +207,6 @@ main (int argc, char **argv)
+   GMenuTreeFlags      flags;
+   GError             *error = NULL;
+ 
+-  g_type_init ();
+-
+ #if 0
+   /* See comment when defining _() at the top of this file. */
+   bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
diff --git a/gnome-menus.spec b/gnome-menus.spec
index 7eb3772..4961e28 100644
--- a/gnome-menus.spec
+++ b/gnome-menus.spec
@@ -3,13 +3,15 @@
 Summary:  A menu system for the GNOME project
 Name: gnome-menus
 Version: 3.10.1
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: LGPLv2+
 Group: System Environment/Libraries
 URL: http://www.gnome.org/
 
 #VCS: git:git://git.gnome.org/gnome-menus
 Source0: http://download.gnome.org/sources/gnome-menus/3.10/%{name}-%{version}.tar.xz
+# Bumps to git master as of 2014-01-08, fixes an annoying crasher
+Patch0: gnome-menus-3.10.1-git94ba6e23c0.patch
 Requires:  redhat-menus
 BuildRequires: gamin-devel
 BuildRequires: gawk
@@ -38,6 +40,7 @@ writing applications that use the GNOME menu system.
 
 %prep
 %setup -q
+%patch0 -p1 -b .git
 
 %build
 %configure --disable-static \
@@ -75,6 +78,9 @@ find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
 %{_datadir}/gir-1.0/GMenu-3.0.gir
 
 %changelog
+* Wed Jan 08 2014 Adam Williamson <awilliam at redhat.com> - 3.10.1-2
+- patch up to current git master (should fix annoying crashes)
+
 * Tue Oct 29 2013 Richard Hughes <rhughes at redhat.com> - 3.10.1-1
 - Update to 3.10.1
 


More information about the scm-commits mailing list