aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2005-08-22 02:50:38 +0000
committerChristian Grothoff <christian@grothoff.org>2005-08-22 02:50:38 +0000
commit1081903401f9abb910909c1bcd98b224b62863f7 (patch)
tree3f5dd9199c655bcb22272690769704a59543231e
parent2d273a28599b184e9c26b154c21614934be4d537 (diff)
downloadgnunet-gtk-1081903401f9abb910909c1bcd98b224b62863f7.tar.gz
gnunet-gtk-1081903401f9abb910909c1bcd98b224b62863f7.zip
deadlock in download abort plus code cleanup
-rw-r--r--src/common/helper.c34
-rw-r--r--src/core/main.c21
-rw-r--r--src/include/gnunetgtk_common.h9
-rw-r--r--src/plugins/fs/download.c21
4 files changed, 61 insertions, 24 deletions
diff --git a/src/common/helper.c b/src/common/helper.c
index 5bbb2586..ebe9fd41 100644
--- a/src/common/helper.c
+++ b/src/common/helper.c
@@ -447,4 +447,38 @@ void doneGNUnetGTKCommon() {
447 MUTEX_DESTROY(&sclock); 447 MUTEX_DESTROY(&sclock);
448} 448}
449 449
450struct rwsc_closure {
451 Semaphore * sig;
452 PThreadMain realMain;
453 void * arg;
454};
455
456static void * shutdownCode(void * arg) {
457 struct rwsc_closure * cls = arg;
458 void * ret;
459
460 ret = cls->realMain(cls->arg);
461 SEMAPHORE_UP(cls->sig);
462 return ret;
463}
464
465void run_with_save_calls(PThreadMain cb,
466 void * arg) {
467 PTHREAD_T doneThread;
468 Semaphore * sig;
469 void * unused;
470
471 sig = SEMAPHORE_NEW(0);
472 if (0 != PTHREAD_CREATE(&doneThread,
473 &shutdownCode,
474 sig,
475 64*1024))
476 DIE_STRERROR("pthread_create");
477 while (OK != SEMAPHORE_DOWN_NONBLOCKING(sig))
478 gtkRunSomeSaveCalls();
479 PTHREAD_JOIN(&doneThread,
480 &unused);
481 SEMAPHORE_FREE(sig);
482}
483
450/* end of helper.c */ 484/* end of helper.c */
diff --git a/src/core/main.c b/src/core/main.c
index 977e041e..ca9919a5 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -88,20 +88,15 @@ static int parseOptions(int argc,
88 return OK; 88 return OK;
89} 89}
90 90
91static void * shutdownCode(void * arg) { 91static void * shutdownCode(void * unused) {
92 Semaphore * sig = arg;
93 stopCron(); 92 stopCron();
94 doneGNUnetGTKCommon(); 93 doneGNUnetGTKCommon();
95 SEMAPHORE_UP(sig);
96 return NULL; 94 return NULL;
97} 95}
98 96
99int main(int argc, 97int main(int argc,
100 char *argv[]) { 98 char *argv[]) {
101 GtkWidget * root; 99 GtkWidget * root;
102 PTHREAD_T doneThread;
103 Semaphore * sig;
104 void * unused;
105 100
106 g_thread_init(NULL); 101 g_thread_init(NULL);
107 gtk_init(&argc, &argv); 102 gtk_init(&argc, &argv);
@@ -133,18 +128,8 @@ int main(int argc,
133 gtk_main(); 128 gtk_main();
134 gdk_threads_leave(); 129 gdk_threads_leave();
135 setCustomLogProc(NULL); 130 setCustomLogProc(NULL);
136 131 run_with_save_calls(&shutdownCode,
137 sig = SEMAPHORE_NEW(0); 132 NULL);
138 if (0 != PTHREAD_CREATE(&doneThread,
139 &shutdownCode,
140 sig,
141 64*1024))
142 DIE_STRERROR("pthread_create");
143 while (OK != SEMAPHORE_DOWN_NONBLOCKING(sig))
144 gtkRunSomeSaveCalls();
145 PTHREAD_JOIN(&doneThread,
146 &unused);
147 SEMAPHORE_FREE(sig);
148 doneUtil(); 133 doneUtil();
149 134
150 return 0; 135 return 0;
diff --git a/src/include/gnunetgtk_common.h b/src/include/gnunetgtk_common.h
index d3b7c265..50cdca3f 100644
--- a/src/include/gnunetgtk_common.h
+++ b/src/include/gnunetgtk_common.h
@@ -80,6 +80,15 @@ void gtkSaveCall(SimpleCallback func,
80int gtkRunSomeSaveCalls(); 80int gtkRunSomeSaveCalls();
81 81
82/** 82/**
83 * Run the given "cb" function and save calls
84 * in parallel (used within the event loop to
85 * keep save calls going while something else
86 * happens).
87 */
88void run_with_save_calls(PThreadMain cb,
89 void * arg);
90
91/**
83 * Bind handlers defined by the various 92 * Bind handlers defined by the various
84 * plugins to the signals defined by the 93 * plugins to the signals defined by the
85 * Glade XML. 94 * Glade XML.
diff --git a/src/plugins/fs/download.c b/src/plugins/fs/download.c
index 3defe98f..5abbd3ae 100644
--- a/src/plugins/fs/download.c
+++ b/src/plugins/fs/download.c
@@ -413,15 +413,14 @@ void on_clearCompletedDownloadsButton_clicked(void * unused,
413 NULL); 413 NULL);
414} 414}
415 415
416static void abortDownloadCallback(GtkTreeModel * model, 416static void * shutdownCode(void * it) {
417 GtkTreePath * path, 417 GtkTreeModel * model;
418 GtkTreeIter * iter, 418 GtkTreeIter * iter = it;
419 GtkTreeStore * tree) {
420 struct ECRS_URI * u; 419 struct ECRS_URI * u;
421 char * fn; 420 char * fn;
422 421
423 GNUNET_ASSERT(model == GTK_TREE_MODEL(summary)); 422 model = GTK_TREE_MODEL(summary);
424 gtk_tree_model_get(GTK_TREE_MODEL(summary), 423 gtk_tree_model_get(model,
425 iter, 424 iter,
426 DOWNLOAD_URI, &u, 425 DOWNLOAD_URI, &u,
427 DOWNLOAD_FILENAME, &fn, 426 DOWNLOAD_FILENAME, &fn,
@@ -433,6 +432,16 @@ static void abortDownloadCallback(GtkTreeModel * model,
433 iter); 432 iter);
434 if (u != NULL) 433 if (u != NULL)
435 ECRS_freeUri(u); 434 ECRS_freeUri(u);
435 return NULL;
436}
437
438static void abortDownloadCallback(GtkTreeModel * model,
439 GtkTreePath * path,
440 GtkTreeIter * iter,
441 GtkTreeStore * tree) {
442 GNUNET_ASSERT(model == GTK_TREE_MODEL(summary));
443 run_with_save_calls(&shutdownCode,
444 iter);
436} 445}
437 446
438void on_abortDownloadButton_clicked(void * unused, 447void on_abortDownloadButton_clicked(void * unused,