aboutsummaryrefslogtreecommitdiff
path: root/src/common/helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/helper.c')
-rw-r--r--src/common/helper.c47
1 files changed, 28 insertions, 19 deletions
diff --git a/src/common/helper.c b/src/common/helper.c
index 8d597df4..c150b989 100644
--- a/src/common/helper.c
+++ b/src/common/helper.c
@@ -33,6 +33,7 @@ typedef struct {
33 Semaphore * sem; 33 Semaphore * sem;
34 void * args; 34 void * args;
35 SimpleCallback func; 35 SimpleCallback func;
36 int destroyed;
36} SaveCall; 37} SaveCall;
37 38
38typedef struct Plugin { 39typedef struct Plugin {
@@ -69,9 +70,27 @@ static Plugin * plugin;
69 70
70static gboolean saveCallWrapper(gpointer data) { 71static gboolean saveCallWrapper(gpointer data) {
71 SaveCall * call = data; 72 SaveCall * call = data;
73 int i;
74
75 /* clearly, we are no longer pending,
76 so remove from psc */
77 if (call->sem != NULL) {
78 MUTEX_LOCK(&sclock);
79 for (i=0;i<pscCount;i++) {
80 if (psc[i] == call) {
81 psc[i] = psc[pscCount-1];
82 break;
83 }
84 }
85 GNUNET_ASSERT(i != pscCount);
86 GROW(psc,
87 pscCount,
88 pscCount-1);
89 MUTEX_UNLOCK(&sclock);
90 }
72 91
73 call->func(call->args); 92 call->func(call->args);
74 if (call->sem != NULL) 93 if (call->sem != NULL)
75 SEMAPHORE_UP(call->sem); 94 SEMAPHORE_UP(call->sem);
76 return FALSE; 95 return FALSE;
77} 96}
@@ -84,7 +103,6 @@ static gboolean saveCallWrapper(gpointer data) {
84void gtkSaveCall(SimpleCallback func, 103void gtkSaveCall(SimpleCallback func,
85 void * args) { 104 void * args) {
86 SaveCall call; 105 SaveCall call;
87 int i;
88 106
89 MUTEX_LOCK(&sclock); 107 MUTEX_LOCK(&sclock);
90 if ( (saveCallsUp == NO) || 108 if ( (saveCallsUp == NO) ||
@@ -92,27 +110,15 @@ void gtkSaveCall(SimpleCallback func,
92 call.args = args; 110 call.args = args;
93 call.func = func; 111 call.func = func;
94 call.sem = SEMAPHORE_NEW(0); 112 call.sem = SEMAPHORE_NEW(0);
113 call.destroyed = 0;
95 GROW(psc, 114 GROW(psc,
96 pscCount, 115 pscCount,
97 pscCount+1); 116 pscCount+1);
98 psc[pscCount-1] = &call; 117 psc[pscCount-1] = &call;
99 MUTEX_UNLOCK(&sclock); 118 gtk_idle_add(&saveCallWrapper,
100 gtk_idle_add(&saveCallWrapper,
101 &call); 119 &call);
102 SEMAPHORE_DOWN(call.sem);
103 /* remove from psc list */
104 MUTEX_LOCK(&sclock);
105 for (i=0;i<pscCount;i++) {
106 if (psc[i] == &call) {
107 psc[i] = psc[pscCount-1];
108 break;
109 }
110 }
111 GNUNET_ASSERT(i != pscCount);
112 GROW(psc,
113 pscCount,
114 pscCount-1);
115 MUTEX_UNLOCK(&sclock); 120 MUTEX_UNLOCK(&sclock);
121 SEMAPHORE_DOWN(call.sem);
116 SEMAPHORE_FREE(call.sem); 122 SEMAPHORE_FREE(call.sem);
117 } else { 123 } else {
118 MUTEX_UNLOCK(&sclock); 124 MUTEX_UNLOCK(&sclock);
@@ -131,8 +137,11 @@ int gtkRunSomeSaveCalls() {
131 return NO; 137 return NO;
132 } 138 }
133 i = randomi(pscCount); 139 i = randomi(pscCount);
134 if (TRUE == g_idle_remove_by_data(psc[i]->args)) 140 g_idle_remove_by_data(psc[i]->args);
135 psc[i]->func(psc[i]); 141 /* yes, ignore return value here, GTK seems
142 to be dropping these during shutdown, and
143 we still want to run them nevertheless */
144 psc[i]->func(psc[i]);
136 MUTEX_UNLOCK(&sclock); 145 MUTEX_UNLOCK(&sclock);
137 gnunet_util_sleep(50 * cronMILLIS); 146 gnunet_util_sleep(50 * cronMILLIS);
138 /* sleep here is somewhat important, first of 147 /* sleep here is somewhat important, first of