Commit 82810a20f9f37ae80fc94a373060e6ae4a93e5b7
1 parent
a2141889
Exists in
master
and in
5 other branches
Isolando filas por sessão.
Showing
2 changed files
with
79 additions
and
64 deletions
Show diff stats
src/lib3270/iocalls.c
@@ -80,41 +80,8 @@ static void internal_ring_bell(H3270 *session); | @@ -80,41 +80,8 @@ static void internal_ring_bell(H3270 *session); | ||
80 | 80 | ||
81 | /*---[ Typedefs ]-------------------------------------------------------------------------------------------*/ | 81 | /*---[ Typedefs ]-------------------------------------------------------------------------------------------*/ |
82 | 82 | ||
83 | - typedef struct timeout | ||
84 | - { | ||
85 | - struct timeout *next; | ||
86 | -#if defined(_WIN32) /*[*/ | ||
87 | - unsigned long long ts; | ||
88 | -#else /*][*/ | ||
89 | - struct timeval tv; | ||
90 | -#endif /*]*/ | ||
91 | - void (*proc)(H3270 *session); | ||
92 | - H3270 *session; | ||
93 | - Boolean in_play; | ||
94 | - } timeout_t; | ||
95 | - | ||
96 | #define TN (timeout_t *)NULL | 83 | #define TN (timeout_t *)NULL |
97 | 84 | ||
98 | -/* I/O events. */ | ||
99 | -typedef struct input | ||
100 | -{ | ||
101 | - struct input * next; | ||
102 | - H3270 * session; | ||
103 | - int fd; | ||
104 | - LIB3270_IO_FLAG flag; | ||
105 | - void * userdata; | ||
106 | - | ||
107 | - void (*call)(H3270 *, int, LIB3270_IO_FLAG, void *); | ||
108 | - | ||
109 | -} input_t; | ||
110 | - | ||
111 | - | ||
112 | -/*---[ Statics ]--------------------------------------------------------------------------------------------*/ | ||
113 | - | ||
114 | - static timeout_t * timeouts = NULL; | ||
115 | - static input_t * inputs = NULL; | ||
116 | - static Boolean inputs_changed = False; | ||
117 | - | ||
118 | /*---[ Implement ]------------------------------------------------------------------------------------------*/ | 85 | /*---[ Implement ]------------------------------------------------------------------------------------------*/ |
119 | 86 | ||
120 | 87 | ||
@@ -165,7 +132,7 @@ static void * internal_add_timeout(H3270 *session, unsigned long interval_ms, vo | @@ -165,7 +132,7 @@ static void * internal_add_timeout(H3270 *session, unsigned long interval_ms, vo | ||
165 | #endif /*]*/ | 132 | #endif /*]*/ |
166 | 133 | ||
167 | /* Find where to insert this item. */ | 134 | /* Find where to insert this item. */ |
168 | - for (t = timeouts; t != TN; t = t->next) | 135 | + for (t = session->timeouts; t != TN; t = t->next) |
169 | { | 136 | { |
170 | #if defined(_WIN32) | 137 | #if defined(_WIN32) |
171 | if (t->ts > t_new->ts) | 138 | if (t->ts > t_new->ts) |
@@ -180,8 +147,8 @@ static void * internal_add_timeout(H3270 *session, unsigned long interval_ms, vo | @@ -180,8 +147,8 @@ static void * internal_add_timeout(H3270 *session, unsigned long interval_ms, vo | ||
180 | // Insert it. | 147 | // Insert it. |
181 | if (prev == TN) | 148 | if (prev == TN) |
182 | { // Front. | 149 | { // Front. |
183 | - t_new->next = timeouts; | ||
184 | - timeouts = t_new; | 150 | + t_new->next = session->timeouts; |
151 | + session->timeouts = t_new; | ||
185 | } | 152 | } |
186 | else if (t == TN) | 153 | else if (t == TN) |
187 | { // Rear. | 154 | { // Rear. |
@@ -210,14 +177,14 @@ static void internal_remove_timeout(H3270 *session, void * timer) | @@ -210,14 +177,14 @@ static void internal_remove_timeout(H3270 *session, void * timer) | ||
210 | if (st->in_play) | 177 | if (st->in_play) |
211 | return; | 178 | return; |
212 | 179 | ||
213 | - for (t = timeouts; t != TN; t = t->next) | 180 | + for (t = session->timeouts; t != TN; t = t->next) |
214 | { | 181 | { |
215 | if (t == st) | 182 | if (t == st) |
216 | { | 183 | { |
217 | if (prev != TN) | 184 | if (prev != TN) |
218 | prev->next = t->next; | 185 | prev->next = t->next; |
219 | else | 186 | else |
220 | - timeouts = t->next; | 187 | + session->timeouts = t->next; |
221 | lib3270_free(t); | 188 | lib3270_free(t); |
222 | return; | 189 | return; |
223 | } | 190 | } |
@@ -231,14 +198,14 @@ static void * internal_add_poll(H3270 *session, int fd, LIB3270_IO_FLAG flag, vo | @@ -231,14 +198,14 @@ static void * internal_add_poll(H3270 *session, int fd, LIB3270_IO_FLAG flag, vo | ||
231 | { | 198 | { |
232 | input_t *ip = (input_t *) lib3270_malloc(sizeof(input_t)); | 199 | input_t *ip = (input_t *) lib3270_malloc(sizeof(input_t)); |
233 | 200 | ||
234 | - ip->session = session; | ||
235 | - ip->fd = fd; | ||
236 | - ip->flag = flag; | ||
237 | - ip->userdata = userdata; | ||
238 | - ip->call = call; | 201 | + ip->session = session; |
202 | + ip->fd = fd; | ||
203 | + ip->flag = flag; | ||
204 | + ip->userdata = userdata; | ||
205 | + ip->call = call; | ||
239 | 206 | ||
240 | - inputs = ip; | ||
241 | - inputs_changed = True; | 207 | + session->inputs = ip; |
208 | + session->inputs_changed = 1; | ||
242 | 209 | ||
243 | return ip; | 210 | return ip; |
244 | } | 211 | } |
@@ -248,7 +215,7 @@ static void internal_remove_poll(H3270 *session, void *id) | @@ -248,7 +215,7 @@ static void internal_remove_poll(H3270 *session, void *id) | ||
248 | input_t *ip; | 215 | input_t *ip; |
249 | input_t *prev = (input_t *)NULL; | 216 | input_t *prev = (input_t *)NULL; |
250 | 217 | ||
251 | - for (ip = inputs; ip != (input_t *)NULL; ip = ip->next) | 218 | + for (ip = session->inputs; ip != (input_t *)NULL; ip = ip->next) |
252 | { | 219 | { |
253 | if (ip == (input_t *)id) | 220 | if (ip == (input_t *)id) |
254 | break; | 221 | break; |
@@ -265,10 +232,10 @@ static void internal_remove_poll(H3270 *session, void *id) | @@ -265,10 +232,10 @@ static void internal_remove_poll(H3270 *session, void *id) | ||
265 | if (prev != (input_t *)NULL) | 232 | if (prev != (input_t *)NULL) |
266 | prev->next = ip->next; | 233 | prev->next = ip->next; |
267 | else | 234 | else |
268 | - inputs = ip->next; | 235 | + session->inputs = ip->next; |
269 | 236 | ||
270 | lib3270_free(ip); | 237 | lib3270_free(ip); |
271 | - inputs_changed = True; | 238 | + session->inputs_changed = 1; |
272 | } | 239 | } |
273 | 240 | ||
274 | LIB3270_EXPORT void lib3270_remove_poll(H3270 *session, void *id) { | 241 | LIB3270_EXPORT void lib3270_remove_poll(H3270 *session, void *id) { |
@@ -281,7 +248,7 @@ LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd) | @@ -281,7 +248,7 @@ LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd) | ||
281 | 248 | ||
282 | input_t *ip; | 249 | input_t *ip; |
283 | 250 | ||
284 | - for (ip = inputs; ip != (input_t *)NULL; ip = ip->next) | 251 | + for (ip = session->inputs; ip != (input_t *)NULL; ip = ip->next) |
285 | { | 252 | { |
286 | if(ip->fd == fd) | 253 | if(ip->fd == fd) |
287 | { | 254 | { |
@@ -299,7 +266,7 @@ LIB3270_EXPORT void lib3270_update_poll_fd(H3270 *session, int fd, LIB3270_IO_F | @@ -299,7 +266,7 @@ LIB3270_EXPORT void lib3270_update_poll_fd(H3270 *session, int fd, LIB3270_IO_F | ||
299 | 266 | ||
300 | input_t *ip; | 267 | input_t *ip; |
301 | 268 | ||
302 | - for (ip = inputs; ip != (input_t *)NULL; ip = ip->next) | 269 | + for (ip = session->inputs; ip != (input_t *)NULL; ip = ip->next) |
303 | { | 270 | { |
304 | if(ip->fd == fd) | 271 | if(ip->fd == fd) |
305 | { | 272 | { |
@@ -337,7 +304,7 @@ int lib3270_default_event_dispatcher(H3270 *hSession, int block) | @@ -337,7 +304,7 @@ int lib3270_default_event_dispatcher(H3270 *hSession, int block) | ||
337 | 304 | ||
338 | retry: | 305 | retry: |
339 | 306 | ||
340 | - inputs_changed = 0; | 307 | + hSession->inputs_changed = 0; |
341 | 308 | ||
342 | // If we've processed any input, then don't block again. | 309 | // If we've processed any input, then don't block again. |
343 | if(processed_any) | 310 | if(processed_any) |
@@ -454,7 +421,7 @@ retry: | @@ -454,7 +421,7 @@ retry: | ||
454 | FD_ZERO(&wfds); | 421 | FD_ZERO(&wfds); |
455 | FD_ZERO(&xfds); | 422 | FD_ZERO(&xfds); |
456 | 423 | ||
457 | - for (ip = inputs; ip != (input_t *)NULL; ip = ip->next) | 424 | + for (ip = hSession->inputs; ip != (input_t *)NULL; ip = ip->next) |
458 | { | 425 | { |
459 | if(ip->flag & LIB3270_IO_FLAG_READ) | 426 | if(ip->flag & LIB3270_IO_FLAG_READ) |
460 | { | 427 | { |
@@ -477,11 +444,11 @@ retry: | @@ -477,11 +444,11 @@ retry: | ||
477 | 444 | ||
478 | if (block) | 445 | if (block) |
479 | { | 446 | { |
480 | - if (timeouts != TN) | 447 | + if (hSession->timeouts != TN) |
481 | { | 448 | { |
482 | (void) gettimeofday(&now, (void *)NULL); | 449 | (void) gettimeofday(&now, (void *)NULL); |
483 | - twait.tv_sec = timeouts->tv.tv_sec - now.tv_sec; | ||
484 | - twait.tv_usec = timeouts->tv.tv_usec - now.tv_usec; | 450 | + twait.tv_sec = hSession->timeouts->tv.tv_sec - now.tv_sec; |
451 | + twait.tv_usec = hSession->timeouts->tv.tv_usec - now.tv_usec; | ||
485 | if (twait.tv_usec < 0L) { | 452 | if (twait.tv_usec < 0L) { |
486 | twait.tv_sec--; | 453 | twait.tv_sec--; |
487 | twait.tv_usec += MILLION; | 454 | twait.tv_usec += MILLION; |
@@ -520,13 +487,13 @@ retry: | @@ -520,13 +487,13 @@ retry: | ||
520 | } | 487 | } |
521 | else | 488 | else |
522 | { | 489 | { |
523 | - for (ip = inputs; ip != (input_t *) NULL; ip = ip->next) | 490 | + for (ip = hSession->inputs; ip != (input_t *) NULL; ip = ip->next) |
524 | { | 491 | { |
525 | if((ip->flag & LIB3270_IO_FLAG_READ) && FD_ISSET(ip->fd, &rfds)) | 492 | if((ip->flag & LIB3270_IO_FLAG_READ) && FD_ISSET(ip->fd, &rfds)) |
526 | { | 493 | { |
527 | (*ip->call)(ip->session,ip->fd,LIB3270_IO_FLAG_READ,ip->userdata); | 494 | (*ip->call)(ip->session,ip->fd,LIB3270_IO_FLAG_READ,ip->userdata); |
528 | processed_any = True; | 495 | processed_any = True; |
529 | - if (inputs_changed) | 496 | + if (hSession->inputs_changed) |
530 | goto retry; | 497 | goto retry; |
531 | } | 498 | } |
532 | 499 | ||
@@ -534,7 +501,7 @@ retry: | @@ -534,7 +501,7 @@ retry: | ||
534 | { | 501 | { |
535 | (*ip->call)(ip->session,ip->fd,LIB3270_IO_FLAG_WRITE,ip->userdata); | 502 | (*ip->call)(ip->session,ip->fd,LIB3270_IO_FLAG_WRITE,ip->userdata); |
536 | processed_any = True; | 503 | processed_any = True; |
537 | - if (inputs_changed) | 504 | + if (hSession->inputs_changed) |
538 | goto retry; | 505 | goto retry; |
539 | } | 506 | } |
540 | 507 | ||
@@ -542,7 +509,7 @@ retry: | @@ -542,7 +509,7 @@ retry: | ||
542 | { | 509 | { |
543 | (*ip->call)(ip->session,ip->fd,LIB3270_IO_FLAG_EXCEPTION,ip->userdata); | 510 | (*ip->call)(ip->session,ip->fd,LIB3270_IO_FLAG_EXCEPTION,ip->userdata); |
544 | processed_any = True; | 511 | processed_any = True; |
545 | - if (inputs_changed) | 512 | + if (hSession->inputs_changed) |
546 | goto retry; | 513 | goto retry; |
547 | } | 514 | } |
548 | } | 515 | } |
@@ -551,7 +518,7 @@ retry: | @@ -551,7 +518,7 @@ retry: | ||
551 | #endif | 518 | #endif |
552 | 519 | ||
553 | // See what's expired. | 520 | // See what's expired. |
554 | - if (timeouts != TN) | 521 | + if (hSession->timeouts != TN) |
555 | { | 522 | { |
556 | #if defined(_WIN32) | 523 | #if defined(_WIN32) |
557 | struct timeout *t; | 524 | struct timeout *t; |
@@ -561,7 +528,7 @@ retry: | @@ -561,7 +528,7 @@ retry: | ||
561 | (void) gettimeofday(&now, (void *)NULL); | 528 | (void) gettimeofday(&now, (void *)NULL); |
562 | #endif | 529 | #endif |
563 | 530 | ||
564 | - while ((t = timeouts) != TN) | 531 | + while ((t = hSession->timeouts) != TN) |
565 | { | 532 | { |
566 | #if defined(_WIN32) | 533 | #if defined(_WIN32) |
567 | if (t->ts <= now) | 534 | if (t->ts <= now) |
@@ -569,7 +536,7 @@ retry: | @@ -569,7 +536,7 @@ retry: | ||
569 | if (t->tv.tv_sec < now.tv_sec ||(t->tv.tv_sec == now.tv_sec && t->tv.tv_usec < now.tv_usec)) | 536 | if (t->tv.tv_sec < now.tv_sec ||(t->tv.tv_sec == now.tv_sec && t->tv.tv_usec < now.tv_usec)) |
570 | #endif | 537 | #endif |
571 | { | 538 | { |
572 | - timeouts = t->next; | 539 | + hSession->timeouts = t->next; |
573 | t->in_play = True; | 540 | t->in_play = True; |
574 | (*t->proc)(t->session); | 541 | (*t->proc)(t->session); |
575 | processed_any = True; | 542 | processed_any = True; |
@@ -579,7 +546,7 @@ retry: | @@ -579,7 +546,7 @@ retry: | ||
579 | } | 546 | } |
580 | } | 547 | } |
581 | 548 | ||
582 | - if (inputs_changed) | 549 | + if (hSession->inputs_changed) |
583 | goto retry; | 550 | goto retry; |
584 | 551 | ||
585 | return processed_any; | 552 | return processed_any; |
src/lib3270/private.h
@@ -245,8 +245,52 @@ struct lib3270_text | @@ -245,8 +245,52 @@ struct lib3270_text | ||
245 | 245 | ||
246 | #define LIB3270_TELNET_N_OPTS 256 | 246 | #define LIB3270_TELNET_N_OPTS 256 |
247 | 247 | ||
248 | +/** | ||
249 | + * | ||
250 | + * @brief Timeout control structure. | ||
251 | + * | ||
252 | + */ | ||
253 | +typedef struct timeout | ||
254 | +{ | ||
255 | + struct timeout *next; | ||
256 | + | ||
257 | +#if defined(_WIN32) /*[*/ | ||
258 | + unsigned long long ts; | ||
259 | +#else /*][*/ | ||
260 | + struct timeval tv; | ||
261 | +#endif /*]*/ | ||
262 | + | ||
263 | + void (*proc)(H3270 *session); | ||
264 | + | ||
265 | + H3270 *session; | ||
248 | 266 | ||
249 | -/** @brief lib3270 session data */ | 267 | + unsigned char in_play; |
268 | +} timeout_t; | ||
269 | + | ||
270 | + | ||
271 | +/** | ||
272 | + * | ||
273 | + * @brief I/O events. | ||
274 | + * | ||
275 | + */ | ||
276 | +typedef struct input | ||
277 | +{ | ||
278 | + struct input * next; | ||
279 | + H3270 * session; | ||
280 | + int fd; | ||
281 | + LIB3270_IO_FLAG flag; | ||
282 | + void * userdata; | ||
283 | + | ||
284 | + void (*call)(H3270 *, int, LIB3270_IO_FLAG, void *); | ||
285 | + | ||
286 | +} input_t; | ||
287 | + | ||
288 | + | ||
289 | +/** | ||
290 | + * | ||
291 | + * @brief lib3270 session data | ||
292 | + * | ||
293 | + */ | ||
250 | struct _h3270 | 294 | struct _h3270 |
251 | { | 295 | { |
252 | struct lib3270_session_callbacks cbk; // Callback table - Always the first one. | 296 | struct lib3270_session_callbacks cbk; // Callback table - Always the first one. |
@@ -555,6 +599,10 @@ struct _h3270 | @@ -555,6 +599,10 @@ struct _h3270 | ||
555 | unsigned long ssl_error; | 599 | unsigned long ssl_error; |
556 | SSL * ssl_con; | 600 | SSL * ssl_con; |
557 | 601 | ||
602 | + timeout_t * timeouts; | ||
603 | + input_t * inputs; | ||
604 | + int inputs_changed : 1; | ||
605 | + | ||
558 | // Callbacks. | 606 | // Callbacks. |
559 | struct lib3270_state_callback * st_callbacks[LIB3270_STATE_USER]; | 607 | struct lib3270_state_callback * st_callbacks[LIB3270_STATE_USER]; |
560 | struct lib3270_state_callback * st_last[LIB3270_STATE_USER]; | 608 | struct lib3270_state_callback * st_last[LIB3270_STATE_USER]; |