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 | 29 | |
| 30 | 30 | #include <config.h> |
| 31 | 31 | #include <lib3270.h> |
| 32 | +#include <lib3270/log.h> | |
| 32 | 33 | #include "private.h" |
| 33 | 34 | |
| 34 | 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 | 143 | |
| 143 | 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 | 152 | struct bgParameter p = { TRUE, hSession, -1, callback, parm }; |
| 146 | 153 | |
| 147 | 154 | p.running = TRUE; |
| ... | ... | @@ -162,7 +169,9 @@ static int static_RunTask(H3270 *hSession, int(*callback)(H3270 *, void *), void |
| 162 | 169 | g_thread_join(thread); |
| 163 | 170 | |
| 164 | 171 | return p.rc; |
| 172 | + */ | |
| 165 | 173 | |
| 174 | + return rc; | |
| 166 | 175 | } |
| 167 | 176 | |
| 168 | 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 | 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 | 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 | 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 | 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 | 958 | const gchar * v3270_default_font = "monospace"; |
| ... | ... | @@ -1020,6 +1045,17 @@ static void v3270_destroy(GtkObject *widget) |
| 1020 | 1045 | { |
| 1021 | 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 | 1059 | if(terminal->accessible) |
| 1024 | 1060 | { |
| 1025 | 1061 | gtk_accessible_set_widget(terminal->accessible, NULL); |
| ... | ... | @@ -1027,12 +1063,6 @@ static void v3270_destroy(GtkObject *widget) |
| 1027 | 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 | 1066 | if(terminal->font.family) |
| 1037 | 1067 | { |
| 1038 | 1068 | g_free(terminal->font.family); | ... | ... |