Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=gfpm.git;a=commitdiff;h=aec8cec35460c971b51610094d39b98fd3915428

commit aec8cec35460c971b51610094d39b98fd3915428
Author: Priyank <priy...@frugalware.org>
Date:   Sat May 30 13:24:00 2009 +0530

Fix crashes/lockups during package search
* probably fixes #3712, #3752, #3790

diff --git a/src/gfpm-interface.c b/src/gfpm-interface.c
index 96652e1..c30a936 100644
--- a/src/gfpm-interface.c
+++ b/src/gfpm-interface.c
@@ -1800,6 +1800,10 @@ cb_gfpm_search_keypress (GtkWidget *widget, GdkEventKey 
*event, gpointer data)
{
g_print ("Error creating search thread: %s\n", error->message);
}
+       else
+       {
+               g_print ("created search thread\n");
+       }
return;
}

@@ -1825,18 +1829,23 @@ gfpm_search (GtkWidget *widget)
guint           nounreg = 0;

g_mutex_lock (search_mutex);
-       gdk_threads_enter ();
+
+       icon_yes = gfpm_get_icon (ICON_INSTALLED, 16);
+       icon_no = gfpm_get_icon (ICON_NINSTALLED, 16);
+       icon_up = gfpm_get_icon (ICON_NEEDUPDATE, 16);
+       icon_ln = gfpm_get_icon (ICON_LOCALNEWER, 16);
+
search_str = (gchar*)gtk_entry_get_text (GTK_ENTRY(widget));
+
if (search_str == NULL)
-       {
-               gdk_threads_leave ();
+       {
goto cleanup;
}
-
+
srepo = gtk_combo_box_get_active_text (GTK_COMBO_BOX(gfpm_search_combo));
+
if (srepo == NULL)
{
-               gdk_threads_leave ();
goto cleanup;
}
if (!strcmp(srepo, _("Installed Packages")))
@@ -1844,9 +1853,14 @@ gfpm_search (GtkWidget *widget)
g_free (srepo);
srepo = g_strdup ("local");
}
+
+       gdk_threads_enter ();
+
model = gtk_tree_view_get_model (GTK_TREE_VIEW(gfpm_pkgs_tvw));
gtk_list_store_clear (GTK_LIST_STORE(model));
store = (GtkListStore*) model;
+       gfpm_update_status (_("Searching for packages ..."));
+
pacman_set_option (PM_OPT_NEEDLES, (long)search_str);
if (!strcmp("local", srepo))
{
@@ -1867,26 +1881,25 @@ gfpm_search (GtkWidget *widget)
l = pacman_db_search (search_db);
r = 1;
}
+
+
+
+       gfpm_update_status (_("Search Complete"));
+
if (l == NULL)
{
-               gfpm_update_status (_("Search Complete"));
-               gfpm_error (_("Package not found"), _("No such package found"));
-               gdk_threads_leave ();
+               g_print ("NOT FOUND !!!\n");
+               //gfpm_error (_("Package not found"), _("No such package 
found"));
goto cleanup;
}
-
-       icon_yes = gfpm_get_icon (ICON_INSTALLED, 16);
-       icon_no = gfpm_get_icon (ICON_NINSTALLED, 16);
-       icon_up = gfpm_get_icon (ICON_NEEDUPDATE, 16);
-       icon_ln = gfpm_get_icon (ICON_LOCALNEWER, 16);
-       gfpm_update_status (_("Searching for packages ..."));
-       gdk_threads_leave ();
-
+
if (r == 0)
{
PM_PKG  *pm_spkg;
PM_PKG  *pm_lpkg;
gboolean up = FALSE;
+               model = gtk_tree_view_get_model ((GtkTreeView*)gfpm_pkgs_tvw);
+               store = (GtkListStore*) model;

for (i=l;i;i=pacman_list_next(i))
{
@@ -1908,7 +1921,7 @@ gfpm_search (GtkWidget *widget)
{
up = FALSE;
}
-                       gdk_threads_enter ();
+
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
0, TRUE,
@@ -1916,10 +1929,8 @@ gfpm_search (GtkWidget *widget)
2, (char*)pacman_pkg_getinfo (pm_lpkg, PM_PKG_NAME),
3, (char*)pacman_pkg_getinfo (pm_lpkg, PM_PKG_VERSION),
4, (char*)pacman_pkg_getinfo (pm_spkg, PM_PKG_VERSION),
-                                       //5, (char*)pacman_pkg_getinfo 
(pm_lpkg, PM_PKG_DESC),
-1);
-                       gdk_flush ();
-                       gdk_threads_leave ();
+
pacman_pkg_free (pm_lpkg);
pacman_pkg_free (pm_spkg);
}
@@ -1930,7 +1941,9 @@ gfpm_search (GtkWidget *widget)
PM_PKG          *pm_lpkg;
gboolean        inst = FALSE;
gboolean        up = FALSE;
-
+
+               model = gtk_tree_view_get_model ((GtkTreeView*)gfpm_pkgs_tvw);
+               store = (GtkListStore*) model;
for (i=l;i;i=pacman_list_next(i))
{
gboolean        ln = FALSE;
@@ -1964,8 +1977,9 @@ gfpm_search (GtkWidget *widget)
}
}
else
+                       {
inst = FALSE;
-                       gdk_threads_enter ();
+                       }
gtk_list_store_append (store, &iter);
if (inst == TRUE)
gtk_list_store_set (store, &iter, 3, (char*)pacman_pkg_getinfo (pm_lpkg, 
PM_PKG_VERSION), -1);
@@ -1977,29 +1991,27 @@ gfpm_search (GtkWidget *widget)
1, (inst==TRUE)?(ln==TRUE)?icon_ln:(up==TRUE)?icon_up:icon_yes:icon_no,
2, (char*)pacman_pkg_getinfo (pm_pkg, PM_PKG_NAME),
4, (char*)pacman_pkg_getinfo (pm_pkg, PM_PKG_VERSION),
-                                       //5, (char*)pacman_pkg_getinfo (pm_pkg, 
PM_PKG_DESC),
-1);
-                       gdk_flush ();
-                       gdk_threads_leave ();
pacman_pkg_free (pm_pkg);
pacman_pkg_free (pm_lpkg);
-                       /*while (gtk_events_pending())
-                               gtk_main_iteration ();*/
}
}
+       gdk_flush ();
+       gdk_threads_leave ();
+
pacman_set_option (PM_OPT_NEEDLES, (long)NULL);
if (search_db!=NULL && !nounreg)
{
pacman_db_unregister (search_db);
}
-       gdk_threads_enter ();
+
gfpm_update_status (_("Searching for packages ...DONE"));

g_object_unref (icon_yes);
g_object_unref (icon_no);
g_object_unref (icon_up);
g_object_unref (icon_ln);
-       gdk_threads_leave ();
+
cleanup:
g_mutex_unlock (search_mutex);

diff --git a/src/gfpm.c b/src/gfpm.c
index 6158648..e14e78d 100644
--- a/src/gfpm.c
+++ b/src/gfpm.c
@@ -44,13 +44,16 @@ main (int argc, char *argv[])
/* invite trouble */
g_thread_init (NULL);

+       /* initialize internal gdk threads mutex */
+       gdk_threads_init ();
+
setlocale (LC_ALL, "");
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
-
+
gtk_init (&argc, &argv);
-
+       gdk_threads_enter ();
path = g_strdup_printf ("%s%s", PREFIX, UI_FILE);

if (!(xml=glade_xml_new(path, NULL, NULL)))
@@ -72,8 +75,9 @@ main (int argc, char *argv[])
gfpm_interface_init ();

/* the main loop */
-       gdk_threads_enter ();
gtk_main ();
+
+       /* phew */
gdk_threads_leave ();

gfpm_db_cleanup ();
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to