diff options
Diffstat (limited to 'src/common/helper.c')
-rw-r--r-- | src/common/helper.c | 47 |
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 | ||
38 | typedef struct Plugin { | 39 | typedef struct Plugin { |
@@ -69,9 +70,27 @@ static Plugin * plugin; | |||
69 | 70 | ||
70 | static gboolean saveCallWrapper(gpointer data) { | 71 | static 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) { | |||
84 | void gtkSaveCall(SimpleCallback func, | 103 | void 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 |