Commit a1115f2267c8a0fb97d2ad828d50560f77a35b09

Authored by perry.werneck@gmail.com
1 parent 5ba60f6d
Exists in master

Vinculando ativação de funções em thread separada à estrutura de sessão

latest/src/gtk2/iocallback.c
... ... @@ -51,7 +51,7 @@
51 51 #include "oia.h"
52 52  
53 53 #ifdef G_THREADS_ENABLED
54   - static int static_CallAndWait(int(*callback)(void *), H3270 *session, void *parm);
  54 + static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm);
55 55 #endif
56 56  
57 57 static unsigned long static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session));
... ... @@ -288,8 +288,9 @@ static gboolean IO_closure(gpointer data)
288 288 struct bgParameter
289 289 {
290 290 gboolean running;
  291 + H3270 *session;
291 292 int rc;
292   - int(*callback)(void *);
  293 + int(*callback)(H3270 *session, void *);
293 294 void *parm;
294 295  
295 296 };
... ... @@ -297,15 +298,15 @@ struct bgParameter
297 298 gpointer BgCall(struct bgParameter *p)
298 299 {
299 300 Trace("%s starts",__FUNCTION__);
300   - p->rc = p->callback(p->parm);
  301 + p->rc = p->callback(p->session,p->parm);
301 302 p->running = FALSE;
302 303 Trace("%s ends",__FUNCTION__);
303 304 return 0;
304 305 }
305 306  
306   -static int static_CallAndWait(int(*callback)(void *), H3270 *session, void *parm)
  307 +static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm)
307 308 {
308   - struct bgParameter p = { TRUE, -1, callback, parm };
  309 + struct bgParameter p = { TRUE, session, -1, callback, parm };
309 310 GThread *thread;
310 311  
311 312 Trace("Starting auxiliary thread for callback %p",callback);
... ...
latest/src/include/lib3270.h
... ... @@ -292,4 +292,18 @@
292 292 LIB3270_EXPORT int lib3270_in_tn3270e(H3270 *h);
293 293 LIB3270_EXPORT int lib3270_in_e(H3270 *h);
294 294  
  295 + /**
  296 + * Call non gui function.
  297 + *
  298 + * Call informed function in a separate thread, keep gui main loop running until
  299 + * the function returns.
  300 + *
  301 + * @param callback Function to call.
  302 + * @param h Related session (for timer indicator)
  303 + * @param parm Parameter to be passed to the function.
  304 + *
  305 + */
  306 + LIB3270_EXPORT int lib3270_call_thread(int(*callback)(H3270 *h, void *), H3270 *h, void *parm);
  307 +
  308 +
295 309 #endif // LIB3270_H_INCLUDED
... ...
latest/src/include/lib3270/api.h
... ... @@ -435,7 +435,7 @@
435 435 unsigned long (*AddOutput)(int source, H3270 *session, void (*fn)(H3270 *session));
436 436 #endif /*]*/
437 437  
438   - int (*CallAndWait)(int(*callback)(void *), H3270 *session, void *parm);
  438 + int (*callthread)(int(*callback)(H3270 *, void *), H3270 *session, void *parm);
439 439  
440 440 int (*Wait)(int seconds);
441 441 int (*RunPendingEvents)(int wait);
... ... @@ -593,8 +593,8 @@
593 593 LIB3270_EXPORT SCRIPT_STATE status_script(SCRIPT_STATE state);
594 594  
595 595 #define Toggled(ix) lib3270_get_toogle(NULL,ix)
  596 + #define CallAndWait(c,h,p) lib3270_call_thread(c,h,p)
596 597  
597   - LIB3270_EXPORT int CallAndWait(int(*callback)(void *), H3270 *session, void *parm);
598 598 LIB3270_EXPORT void RunPendingEvents(int wait);
599 599 LIB3270_EXPORT int Wait(int seconds);
600 600  
... ...
latest/src/lib/XtGlue.c
... ... @@ -957,12 +957,14 @@ LIB3270_EXPORT int lib3270_in_e(H3270 *h)
957 957 return (h->cstate >= CONNECTED_INITIAL_E);
958 958 }
959 959  
960   -int CallAndWait(int(*callback)(void *), H3270 *session, void *parm)
  960 +LIB3270_EXPORT int lib3270_call_thread(int(*callback)(H3270 *h, void *), H3270 *h, void *parm)
961 961 {
962   - if(callbacks->CallAndWait)
963   - return callbacks->CallAndWait(callback,session,parm);
  962 + CHECK_SESSION_HANDLE(h);
  963 +
  964 + if(callbacks->callthread)
  965 + return callbacks->callthread(callback,h,parm);
964 966 else
965   - return callback(parm);
  967 + return callback(h,parm);
966 968 }
967 969  
968 970 void RunPendingEvents(int wait)
... ...
latest/src/lib/resolver.c
... ... @@ -84,7 +84,7 @@ struct parms
84 84 * Returns 0 for success, -1 for fatal error (name resolution impossible),
85 85 * -2 for simple error (cannot resolve the name).
86 86 */
87   -static int cresolve_host_and_port(struct parms *p)
  87 +static int cresolve_host_and_port(H3270 *h, struct parms *p)
88 88 {
89 89 #ifdef AF_INET6
90 90  
... ... @@ -183,7 +183,7 @@ int resolve_host_and_port(const char *host, char *portname, unsigned short *ppor
183 183  
184 184 Trace("Calling resolver for %s", p.host);
185 185  
186   - rc = CallAndWait((int (*)(void *)) cresolve_host_and_port,&h3270,&p);
  186 + rc = CallAndWait((int (*)(H3270 *, void *)) cresolve_host_and_port,&h3270,&p);
187 187  
188 188 Trace("Calling resolver for %s exits with %d", p.host, rc);
189 189  
... ...