Commit 77b3b549f14202391011e484a025162e48f4a300
1 parent
caf4cba9
Exists in
master
and in
1 other branch
Working on bug related with multi-threaded updates.
Showing
2 changed files
with
50 additions
and
11 deletions
Show diff stats
src/v3270/iocallback.c
@@ -29,6 +29,7 @@ | @@ -29,6 +29,7 @@ | ||
29 | 29 | ||
30 | #include <config.h> | 30 | #include <config.h> |
31 | #include <lib3270.h> | 31 | #include <lib3270.h> |
32 | +#include <lib3270/log.h> | ||
32 | #include "private.h" | 33 | #include "private.h" |
33 | 34 | ||
34 | static void * static_AddSource(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata); | 35 | 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) | @@ -142,6 +143,12 @@ gpointer BgCall(struct bgParameter *p) | ||
142 | 143 | ||
143 | static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void *parm) | 144 | static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void *parm) |
144 | { | 145 | { |
146 | + trace("%s starts -------------------------------------", __FUNCTION__); | ||
147 | + | ||
148 | + int rc = callback(hSession,parm); | ||
149 | + | ||
150 | + trace("%s starts -------------------------------------", __FUNCTION__); | ||
151 | + /* | ||
145 | struct bgParameter p = { TRUE, hSession, -1, callback, parm }; | 152 | struct bgParameter p = { TRUE, hSession, -1, callback, parm }; |
146 | 153 | ||
147 | p.running = TRUE; | 154 | p.running = TRUE; |
@@ -162,7 +169,9 @@ static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void | @@ -162,7 +169,9 @@ static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void | ||
162 | g_thread_join(thread); | 169 | g_thread_join(thread); |
163 | 170 | ||
164 | return p.rc; | 171 | return p.rc; |
172 | + */ | ||
165 | 173 | ||
174 | + return rc; | ||
166 | } | 175 | } |
167 | 176 | ||
168 | void v3270_register_io_handlers(G_GNUC_UNUSED v3270Class *cls) | 177 | void v3270_register_io_handlers(G_GNUC_UNUSED v3270Class *cls) |
src/v3270/widget.c
@@ -727,9 +727,24 @@ static void update_toggle(H3270 *session, LIB3270_TOGGLE ix, unsigned char value | @@ -727,9 +727,24 @@ static void update_toggle(H3270 *session, LIB3270_TOGGLE ix, unsigned char value | ||
727 | 727 | ||
728 | } | 728 | } |
729 | 729 | ||
730 | -static void update_message(H3270 *session, LIB3270_MESSAGE id) | 730 | +static void bg_update_message(H3270 *session) |
731 | { | 731 | { |
732 | - g_signal_emit(GTK_WIDGET(lib3270_get_user_data(session)), v3270_widget_signal[SIGNAL_MESSAGE_CHANGED], 0, (gint) id); | 732 | + void *widget = lib3270_get_user_data(session); |
733 | + trace("-----A %s %p",__FUNCTION__, lib3270_get_user_data(session)); | ||
734 | + | ||
735 | + g_signal_emit( | ||
736 | + GTK_WIDGET(widget), | ||
737 | + v3270_widget_signal[SIGNAL_MESSAGE_CHANGED], | ||
738 | + 0, | ||
739 | + (gint) lib3270_get_program_message(session) | ||
740 | + ); | ||
741 | + | ||
742 | + trace("-----B %s %p",__FUNCTION__, lib3270_get_user_data(session)); | ||
743 | +} | ||
744 | + | ||
745 | +static void update_message(H3270 *session, G_GNUC_UNUSED LIB3270_MESSAGE id) | ||
746 | +{ | ||
747 | + g_idle_add((GSourceFunc) bg_update_message, session); | ||
733 | } | 748 | } |
734 | 749 | ||
735 | static void update_luname(H3270 *session, const char *name) | 750 | 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 | @@ -923,11 +938,21 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title | ||
923 | 938 | ||
924 | } | 939 | } |
925 | 940 | ||
926 | - static void update_ssl(H3270 *session, G_GNUC_UNUSED LIB3270_SSL_STATE state) | 941 | + static gboolean bg_update_ssl(H3270 *session) |
927 | { | 942 | { |
928 | - v3270_blink_ssl(GTK_V3270(lib3270_get_user_data(session))); | ||
929 | - if(state == LIB3270_SSL_NEGOTIATING) | 943 | + trace("%s",__FUNCTION__); |
944 | + | ||
945 | + v3270_blink_ssl(GTK_V3270(lib3270_get_user_data(session))); | ||
946 | + | ||
947 | + if(lib3270_get_secure(session) == LIB3270_SSL_NEGOTIATING) | ||
930 | v3270_start_blinking(GTK_WIDGET(lib3270_get_user_data(session))); | 948 | v3270_start_blinking(GTK_WIDGET(lib3270_get_user_data(session))); |
949 | + | ||
950 | + return FALSE; | ||
951 | + } | ||
952 | + | ||
953 | + static void update_ssl(H3270 *session, G_GNUC_UNUSED LIB3270_SSL_STATE state) | ||
954 | + { | ||
955 | + g_idle_add((GSourceFunc) bg_update_ssl, session); | ||
931 | } | 956 | } |
932 | 957 | ||
933 | const gchar * v3270_default_font = "monospace"; | 958 | const gchar * v3270_default_font = "monospace"; |
@@ -1020,6 +1045,17 @@ static void v3270_destroy(GtkObject *widget) | @@ -1020,6 +1045,17 @@ static void v3270_destroy(GtkObject *widget) | ||
1020 | { | 1045 | { |
1021 | v3270 * terminal = GTK_V3270(widget); | 1046 | v3270 * terminal = GTK_V3270(widget); |
1022 | 1047 | ||
1048 | + if(terminal->host) | ||
1049 | + { | ||
1050 | + // Cleanup | ||
1051 | + lib3270_reset_callbacks(terminal->host); | ||
1052 | + lib3270_set_user_data(terminal->host,NULL); | ||
1053 | + | ||
1054 | + // Release session | ||
1055 | + lib3270_session_free(terminal->host); | ||
1056 | + terminal->host = NULL; | ||
1057 | + } | ||
1058 | + | ||
1023 | if(terminal->accessible) | 1059 | if(terminal->accessible) |
1024 | { | 1060 | { |
1025 | gtk_accessible_set_widget(terminal->accessible, NULL); | 1061 | gtk_accessible_set_widget(terminal->accessible, NULL); |
@@ -1027,12 +1063,6 @@ static void v3270_destroy(GtkObject *widget) | @@ -1027,12 +1063,6 @@ static void v3270_destroy(GtkObject *widget) | ||
1027 | terminal->accessible = NULL; | 1063 | terminal->accessible = NULL; |
1028 | } | 1064 | } |
1029 | 1065 | ||
1030 | - if(terminal->host) | ||
1031 | - { | ||
1032 | - lib3270_session_free(terminal->host); | ||
1033 | - terminal->host = NULL; | ||
1034 | - } | ||
1035 | - | ||
1036 | if(terminal->font.family) | 1066 | if(terminal->font.family) |
1037 | { | 1067 | { |
1038 | g_free(terminal->font.family); | 1068 | g_free(terminal->font.family); |