From 77b3b549f14202391011e484a025162e48f4a300 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Thu, 17 Jan 2019 19:46:27 -0200 Subject: [PATCH] Working on bug related with multi-threaded updates. --- src/v3270/iocallback.c | 9 +++++++++ src/v3270/widget.c | 52 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/v3270/iocallback.c b/src/v3270/iocallback.c index 24c4bfb..9ee586e 100644 --- a/src/v3270/iocallback.c +++ b/src/v3270/iocallback.c @@ -29,6 +29,7 @@ #include #include +#include #include "private.h" static void * static_AddSource(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata); @@ -142,6 +143,12 @@ gpointer BgCall(struct bgParameter *p) static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void *parm) { + trace("%s starts -------------------------------------", __FUNCTION__); + + int rc = callback(hSession,parm); + + trace("%s starts -------------------------------------", __FUNCTION__); + /* struct bgParameter p = { TRUE, hSession, -1, callback, parm }; p.running = TRUE; @@ -162,7 +169,9 @@ static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void g_thread_join(thread); return p.rc; + */ + return rc; } void v3270_register_io_handlers(G_GNUC_UNUSED v3270Class *cls) diff --git a/src/v3270/widget.c b/src/v3270/widget.c index 001bb53..ecebc18 100644 --- a/src/v3270/widget.c +++ b/src/v3270/widget.c @@ -727,9 +727,24 @@ static void update_toggle(H3270 *session, LIB3270_TOGGLE ix, unsigned char value } -static void update_message(H3270 *session, LIB3270_MESSAGE id) +static void bg_update_message(H3270 *session) { - g_signal_emit(GTK_WIDGET(lib3270_get_user_data(session)), v3270_widget_signal[SIGNAL_MESSAGE_CHANGED], 0, (gint) id); + void *widget = lib3270_get_user_data(session); + trace("-----A %s %p",__FUNCTION__, lib3270_get_user_data(session)); + + g_signal_emit( + GTK_WIDGET(widget), + v3270_widget_signal[SIGNAL_MESSAGE_CHANGED], + 0, + (gint) lib3270_get_program_message(session) + ); + + trace("-----B %s %p",__FUNCTION__, lib3270_get_user_data(session)); +} + +static void update_message(H3270 *session, G_GNUC_UNUSED LIB3270_MESSAGE id) +{ + g_idle_add((GSourceFunc) bg_update_message, session); } static void update_luname(H3270 *session, const char *name) @@ -923,11 +938,21 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title } - static void update_ssl(H3270 *session, G_GNUC_UNUSED LIB3270_SSL_STATE state) + static gboolean bg_update_ssl(H3270 *session) { - v3270_blink_ssl(GTK_V3270(lib3270_get_user_data(session))); - if(state == LIB3270_SSL_NEGOTIATING) + trace("%s",__FUNCTION__); + + v3270_blink_ssl(GTK_V3270(lib3270_get_user_data(session))); + + if(lib3270_get_secure(session) == LIB3270_SSL_NEGOTIATING) v3270_start_blinking(GTK_WIDGET(lib3270_get_user_data(session))); + + return FALSE; + } + + static void update_ssl(H3270 *session, G_GNUC_UNUSED LIB3270_SSL_STATE state) + { + g_idle_add((GSourceFunc) bg_update_ssl, session); } const gchar * v3270_default_font = "monospace"; @@ -1020,6 +1045,17 @@ static void v3270_destroy(GtkObject *widget) { v3270 * terminal = GTK_V3270(widget); + if(terminal->host) + { + // Cleanup + lib3270_reset_callbacks(terminal->host); + lib3270_set_user_data(terminal->host,NULL); + + // Release session + lib3270_session_free(terminal->host); + terminal->host = NULL; + } + if(terminal->accessible) { gtk_accessible_set_widget(terminal->accessible, NULL); @@ -1027,12 +1063,6 @@ static void v3270_destroy(GtkObject *widget) terminal->accessible = NULL; } - if(terminal->host) - { - lib3270_session_free(terminal->host); - terminal->host = NULL; - } - if(terminal->font.family) { g_free(terminal->font.family); -- libgit2 0.21.2