Commit 48c976f5ef66a1880c586fb18af578dbbd59b3a7

Authored by Perry Werneck
1 parent 3d6bf4b9
Exists in master and in 1 other branch develop

Fixing exit hang.

Showing 1 changed file with 23 additions and 4 deletions   Show diff stats
src/terminal/widget.c
... ... @@ -184,6 +184,18 @@ static void v3270_toggle_changed(G_GNUC_UNUSED v3270 *widget, G_GNUC_UNUSED LIB3
184 184 {
185 185 }
186 186  
  187 +static gboolean delayed_cleanup(H3270 *hSession) {
  188 +
  189 + if(lib3270_get_task_count(hSession))
  190 + return G_SOURCE_CONTINUE;
  191 +
  192 + g_message("Delayed cleanup complete");
  193 + lib3270_free(hSession);
  194 +
  195 + return G_SOURCE_REMOVE;
  196 +
  197 +}
  198 +
187 199 static void finalize(GObject *object) {
188 200  
189 201 debug("V3270::%s",__FUNCTION__);
... ... @@ -196,13 +208,18 @@ static void finalize(GObject *object) {
196 208 lib3270_disconnect(terminal->host);
197 209  
198 210 debug("Task count: %u",lib3270_get_task_count(terminal->host));
199   - while(lib3270_get_task_count(terminal->host))
  211 + if(lib3270_get_task_count(terminal->host))
  212 + {
  213 + // Should wait.
  214 + g_message("TN3270 session is busy, delaying cleanup");
  215 + lib3270_set_user_data(terminal->host,NULL);
  216 + g_idle_add((GSourceFunc) delayed_cleanup,terminal->host);
  217 + }
  218 + else
200 219 {
201   - debug("%s: waiting",__FUNCTION__);
202   - usleep(100);
  220 + lib3270_session_free(terminal->host);
203 221 }
204 222  
205   - lib3270_session_free(terminal->host);
206 223 terminal->host = NULL;
207 224 }
208 225  
... ... @@ -608,6 +625,8 @@ static void v3270_destroy(GtkWidget *widget)
608 625 // Cleanup
609 626 lib3270_reset_callbacks(terminal->host);
610 627 lib3270_set_user_data(terminal->host,NULL);
  628 +
  629 + debug("%s: disconnecting", __FUNCTION__);
611 630 lib3270_disconnect(terminal->host);
612 631 }
613 632  
... ...