diff options
author | Christian Grothoff <christian@grothoff.org> | 2005-08-22 02:50:38 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2005-08-22 02:50:38 +0000 |
commit | 1081903401f9abb910909c1bcd98b224b62863f7 (patch) | |
tree | 3f5dd9199c655bcb22272690769704a59543231e | |
parent | 2d273a28599b184e9c26b154c21614934be4d537 (diff) | |
download | gnunet-gtk-1081903401f9abb910909c1bcd98b224b62863f7.tar.gz gnunet-gtk-1081903401f9abb910909c1bcd98b224b62863f7.zip |
deadlock in download abort plus code cleanup
-rw-r--r-- | src/common/helper.c | 34 | ||||
-rw-r--r-- | src/core/main.c | 21 | ||||
-rw-r--r-- | src/include/gnunetgtk_common.h | 9 | ||||
-rw-r--r-- | src/plugins/fs/download.c | 21 |
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 | ||
450 | struct rwsc_closure { | ||
451 | Semaphore * sig; | ||
452 | PThreadMain realMain; | ||
453 | void * arg; | ||
454 | }; | ||
455 | |||
456 | static 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 | |||
465 | void 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 | ||
91 | static void * shutdownCode(void * arg) { | 91 | static 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 | ||
99 | int main(int argc, | 97 | int 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, | |||
80 | int gtkRunSomeSaveCalls(); | 80 | int 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 | */ | ||
88 | void 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 | ||
416 | static void abortDownloadCallback(GtkTreeModel * model, | 416 | static 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 | |||
438 | static 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 | ||
438 | void on_abortDownloadButton_clicked(void * unused, | 447 | void on_abortDownloadButton_clicked(void * unused, |