gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r1837 - in gnunet-gtk/src: common core include plugins/fs


From: grothoff
Subject: [GNUnet-SVN] r1837 - in gnunet-gtk/src: common core include plugins/fs
Date: Sun, 21 Aug 2005 19:50:39 -0700 (PDT)

Author: grothoff
Date: 2005-08-21 19:50:38 -0700 (Sun, 21 Aug 2005)
New Revision: 1837

Modified:
   gnunet-gtk/src/common/helper.c
   gnunet-gtk/src/core/main.c
   gnunet-gtk/src/include/gnunetgtk_common.h
   gnunet-gtk/src/plugins/fs/download.c
Log:
deadlock in download abort plus code cleanup

Modified: gnunet-gtk/src/common/helper.c
===================================================================
--- gnunet-gtk/src/common/helper.c      2005-08-22 02:38:20 UTC (rev 1836)
+++ gnunet-gtk/src/common/helper.c      2005-08-22 02:50:38 UTC (rev 1837)
@@ -447,4 +447,38 @@
   MUTEX_DESTROY(&sclock);
 }
 
+struct rwsc_closure {
+  Semaphore * sig;
+  PThreadMain realMain;
+  void * arg;
+};
+
+static void * shutdownCode(void * arg) {
+  struct rwsc_closure * cls = arg;
+  void * ret;
+
+  ret = cls->realMain(cls->arg);
+  SEMAPHORE_UP(cls->sig);
+  return ret;
+}
+
+void run_with_save_calls(PThreadMain cb,
+                        void * arg) {
+ PTHREAD_T doneThread;
+ Semaphore * sig;
+ void * unused;
+ 
+  sig = SEMAPHORE_NEW(0);
+  if (0 != PTHREAD_CREATE(&doneThread,
+                         &shutdownCode,
+                         sig,
+                         64*1024))
+    DIE_STRERROR("pthread_create");
+  while (OK != SEMAPHORE_DOWN_NONBLOCKING(sig))
+    gtkRunSomeSaveCalls();
+  PTHREAD_JOIN(&doneThread,
+              &unused);
+  SEMAPHORE_FREE(sig);
+}
+
 /* end of helper.c */

Modified: gnunet-gtk/src/core/main.c
===================================================================
--- gnunet-gtk/src/core/main.c  2005-08-22 02:38:20 UTC (rev 1836)
+++ gnunet-gtk/src/core/main.c  2005-08-22 02:50:38 UTC (rev 1837)
@@ -88,20 +88,15 @@
   return OK;
 }
 
-static void * shutdownCode(void * arg) {
-  Semaphore * sig = arg;
+static void * shutdownCode(void * unused) {
   stopCron();
   doneGNUnetGTKCommon();
-  SEMAPHORE_UP(sig);
   return NULL;
 }
 
 int main(int argc, 
         char *argv[]) {
   GtkWidget * root;
-  PTHREAD_T doneThread;
-  Semaphore * sig;
-  void * unused;
   
   g_thread_init(NULL);
   gtk_init(&argc, &argv);
@@ -133,18 +128,8 @@
   gtk_main();
   gdk_threads_leave();
   setCustomLogProc(NULL);
-
-  sig = SEMAPHORE_NEW(0);
-  if (0 != PTHREAD_CREATE(&doneThread,
-                         &shutdownCode,
-                         sig,
-                         64*1024))
-    DIE_STRERROR("pthread_create");
-  while (OK != SEMAPHORE_DOWN_NONBLOCKING(sig))
-    gtkRunSomeSaveCalls();
-  PTHREAD_JOIN(&doneThread,
-              &unused);
-  SEMAPHORE_FREE(sig);
+  run_with_save_calls(&shutdownCode,
+                     NULL);
   doneUtil();
   
   return 0;

Modified: gnunet-gtk/src/include/gnunetgtk_common.h
===================================================================
--- gnunet-gtk/src/include/gnunetgtk_common.h   2005-08-22 02:38:20 UTC (rev 
1836)
+++ gnunet-gtk/src/include/gnunetgtk_common.h   2005-08-22 02:50:38 UTC (rev 
1837)
@@ -80,6 +80,15 @@
 int gtkRunSomeSaveCalls();
 
 /**
+ * Run the given "cb" function and save calls
+ * in parallel (used within the event loop to
+ * keep save calls going while something else
+ * happens).
+ */
+void run_with_save_calls(PThreadMain cb,
+                        void * arg);
+
+/**
  * Bind handlers defined by the various
  * plugins to the signals defined by the
  * Glade XML.

Modified: gnunet-gtk/src/plugins/fs/download.c
===================================================================
--- gnunet-gtk/src/plugins/fs/download.c        2005-08-22 02:38:20 UTC (rev 
1836)
+++ gnunet-gtk/src/plugins/fs/download.c        2005-08-22 02:50:38 UTC (rev 
1837)
@@ -413,15 +413,14 @@
                               NULL);
 }
 
-static void abortDownloadCallback(GtkTreeModel * model,
-                                 GtkTreePath * path,
-                                 GtkTreeIter * iter,
-                                 GtkTreeStore * tree) {
+static void * shutdownCode(void * it) {
+  GtkTreeModel * model;
+  GtkTreeIter * iter = it; 
   struct ECRS_URI * u;
   char * fn;
 
-  GNUNET_ASSERT(model == GTK_TREE_MODEL(summary));
-  gtk_tree_model_get(GTK_TREE_MODEL(summary),
+  model = GTK_TREE_MODEL(summary);
+  gtk_tree_model_get(model,
                     iter,
                     DOWNLOAD_URI, &u,
                     DOWNLOAD_FILENAME, &fn,
@@ -433,8 +432,18 @@
                        iter);
   if (u != NULL)
     ECRS_freeUri(u);  
+  return NULL;
 }
 
+static void abortDownloadCallback(GtkTreeModel * model,
+                                 GtkTreePath * path,
+                                 GtkTreeIter * iter,
+                                 GtkTreeStore * tree) {
+  GNUNET_ASSERT(model == GTK_TREE_MODEL(summary));
+  run_with_save_calls(&shutdownCode,
+                     iter);
+}
+
 void on_abortDownloadButton_clicked(void * unused,
                                    GtkWidget * clearButton) {
   GtkTreeSelection * selection;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]