diff options
author | Christian Grothoff <christian@grothoff.org> | 2014-04-07 18:17:39 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2014-04-07 18:17:39 +0000 |
commit | d45fe94a7d9600836ac9e3ef74aae8c568a5c154 (patch) | |
tree | 36d55c6a659460cfec075655e5edf2a8e203325f /src/main | |
parent | 789fcb27083c90e79d28b5ead5aef13fef6137dd (diff) | |
download | gnunet-gtk-d45fe94a7d9600836ac9e3ef74aae8c568a5c154.tar.gz gnunet-gtk-d45fe94a7d9600836ac9e3ef74aae8c568a5c154.zip |
-fix segv on shutdown
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/gnunet-gtk.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/main/gnunet-gtk.c b/src/main/gnunet-gtk.c index f28e5749..3cc29b0d 100644 --- a/src/main/gnunet-gtk.c +++ b/src/main/gnunet-gtk.c | |||
@@ -74,6 +74,11 @@ struct Plug | |||
74 | */ | 74 | */ |
75 | GNUNET_SCHEDULER_TaskIdentifier restart_task; | 75 | GNUNET_SCHEDULER_TaskIdentifier restart_task; |
76 | 76 | ||
77 | /** | ||
78 | * ID of the signal associated with the window. | ||
79 | */ | ||
80 | gulong sig_id; | ||
81 | |||
77 | }; | 82 | }; |
78 | 83 | ||
79 | 84 | ||
@@ -145,6 +150,8 @@ cleanup_task (void *cls, | |||
145 | GNUNET_SCHEDULER_cancel (p->restart_task); | 150 | GNUNET_SCHEDULER_cancel (p->restart_task); |
146 | p->restart_task = GNUNET_SCHEDULER_NO_TASK; | 151 | p->restart_task = GNUNET_SCHEDULER_NO_TASK; |
147 | } | 152 | } |
153 | g_signal_handler_disconnect (p->s, | ||
154 | p->sig_id); | ||
148 | GNUNET_CONTAINER_DLL_remove (p_head, | 155 | GNUNET_CONTAINER_DLL_remove (p_head, |
149 | p_tail, | 156 | p_tail, |
150 | p); | 157 | p); |
@@ -230,9 +237,12 @@ handle_remove (GtkSocket *sock, | |||
230 | { | 237 | { |
231 | struct Plug *p = userdata; | 238 | struct Plug *p = userdata; |
232 | 239 | ||
233 | (void) GNUNET_OS_process_kill (p->proc, SIGTERM); | 240 | if (NULL != p->proc) |
234 | GNUNET_OS_process_destroy (p->proc); | 241 | { |
235 | p->proc = NULL; | 242 | (void) GNUNET_OS_process_kill (p->proc, SIGTERM); |
243 | GNUNET_OS_process_destroy (p->proc); | ||
244 | p->proc = NULL; | ||
245 | } | ||
236 | p->backoff = GNUNET_TIME_STD_BACKOFF (p->backoff); | 246 | p->backoff = GNUNET_TIME_STD_BACKOFF (p->backoff); |
237 | p->restart_task = GNUNET_SCHEDULER_add_delayed (p->backoff, | 247 | p->restart_task = GNUNET_SCHEDULER_add_delayed (p->backoff, |
238 | &restart_process, | 248 | &restart_process, |
@@ -264,10 +274,10 @@ plug (const char *container, | |||
264 | gtk_container_add (v, p->s); | 274 | gtk_container_add (v, p->s); |
265 | p->binary = binary; | 275 | p->binary = binary; |
266 | p->env_var = env_var; | 276 | p->env_var = env_var; |
267 | g_signal_connect (p->s, | 277 | p->sig_id = g_signal_connect (p->s, |
268 | "plug-removed", | 278 | "plug-removed", |
269 | G_CALLBACK (handle_remove), | 279 | G_CALLBACK (handle_remove), |
270 | p); | 280 | p); |
271 | start_process (p); | 281 | start_process (p); |
272 | gtk_widget_show (p->s); | 282 | gtk_widget_show (p->s); |
273 | GNUNET_CONTAINER_DLL_insert (p_head, | 283 | GNUNET_CONTAINER_DLL_insert (p_head, |