Changeset df0138f
- Timestamp:
- Oct 27, 2009, 12:41:09 AM (15 years ago)
- Branches:
- master, release-1.10, release-1.5, release-1.6, release-1.7, release-1.8, release-1.9
- Children:
- ffc4df6
- Parents:
- f9d257b
- git-author:
- Alejandro R. Sedeño <asedeno@mit.edu> (10/20/09 20:20:12)
- git-committer:
- Alejandro R. Sedeño <asedeno@mit.edu> (10/27/09 00:41:09)
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
global.c
r23fddad rdf0138f 113 113 owl_message_init_fmtext_cache(); 114 114 owl_list_create(&(g->dispatchlist)); 115 owl_list_create(&(g->io_dispatch_list)); 115 116 owl_list_create(&(g->psa_list)); 116 117 g->timerlist = NULL; … … 945 946 } 946 947 948 owl_list *owl_global_get_io_dispatch_list(owl_global *g) 949 { 950 return &(g->io_dispatch_list); 951 } 952 947 953 owl_list *owl_global_get_psa_list(owl_global *g) 948 954 { -
owl.h
r6337cb5 rdf0138f 105 105 #define OWL_MESSAGE_DIRECTION_OUT 2 106 106 107 #define OWL_ MUX_READ 1108 #define OWL_ MUX_WRITE 2109 #define OWL_ MUX_EXCEPT 4107 #define OWL_IO_READ 1 108 #define OWL_IO_WRITE 2 109 #define OWL_IO_EXCEPT 4 110 110 111 111 #define OWL_DIRECTION_NONE 0 … … 508 508 void *data; 509 509 } owl_dispatch; 510 511 typedef struct _owl_io_dispatch { 512 int fd; /* FD to watch for dispatch. */ 513 int mode; 514 int needs_gc; 515 void (*callback)(const struct _owl_io_dispatch *, void *); /* C function to dispatch to. */ 516 void (*destroy)(const struct _owl_io_dispatch *); /* Destructor */ 517 void *data; 518 } owl_io_dispatch; 510 519 511 520 typedef struct _owl_ps_action { … … 595 604 owl_obarray obarray; 596 605 owl_list dispatchlist; 606 owl_list io_dispatch_list; 597 607 owl_list psa_list; 598 608 GList *timerlist; -
perlconfig.c
rfb7742c rdf0138f 510 510 } 511 511 512 void owl_perlconfig_io_dispatch_destroy(const owl_io_dispatch *d) 513 { 514 SvREFCNT_dec(d->data); 515 } 516 512 517 void owl_perlconfig_edit_callback(owl_editwin *e) 513 518 { … … 580 585 } 581 586 587 void owl_perlconfig_io_dispatch(const owl_io_dispatch *d, void *data) 588 { 589 SV *cb = data; 590 dSP; 591 if(cb == NULL) { 592 owl_function_error("Perl callback is NULL!"); 593 return; 594 } 595 596 ENTER; 597 SAVETMPS; 598 599 PUSHMARK(SP); 600 PUTBACK; 601 602 call_sv(cb, G_DISCARD|G_KEEPERR|G_EVAL); 603 604 if(SvTRUE(ERRSV)) { 605 owl_function_error("%s", SvPV_nolen(ERRSV)); 606 } 607 608 FREETMPS; 609 LEAVE; 610 } 611 582 612 void owl_perlconfig_perl_timer(owl_timer *t, void *data) 583 613 { -
select.c
r4f2166b rdf0138f 203 203 204 204 dl = owl_global_get_dispatchlist(&g); 205 FD_ZERO(r);206 FD_ZERO(e);207 205 max_fd = 0; 208 206 len = owl_select_dispatch_count(); … … 260 258 } 261 259 260 static const owl_io_dispatch *owl_select_find_io_dispatch_by_fd(const int fd) 261 { 262 int i, len; 263 const owl_list *dl; 264 owl_io_dispatch *d; 265 dl = owl_global_get_io_dispatch_list(&g); 266 len = owl_list_get_size(dl); 267 for(i = 0; i < len; i++) { 268 d = owl_list_get_element(dl, i); 269 if (d->fd == fd) return d; 270 } 271 return NULL; 272 } 273 274 static int owl_select_find_io_dispatch(const owl_io_dispatch *in) 275 { 276 int i, len; 277 const owl_list *dl; 278 279 if (in != NULL) { 280 dl = owl_global_get_io_dispatch_list(&g); 281 len = owl_list_get_size(dl); 282 for(i = 0; i < len; i++) { 283 const owl_io_dispatch *d = owl_list_get_element(dl, i); 284 if (d == in) return i; 285 } 286 } 287 return -1; 288 } 289 290 void owl_select_remove_io_dispatch(const owl_io_dispatch *in) 291 { 292 int elt; 293 if (in != NULL) { 294 elt = owl_select_find_io_dispatch(in); 295 if (elt != -1) { 296 owl_list *dl = owl_global_get_io_dispatch_list(&g); 297 owl_io_dispatch *d = owl_list_get_element(dl, elt); 298 if (dispatch_active) 299 d->needs_gc = 1; 300 else { 301 owl_list_remove_element(dl, elt); 302 if (d->destroy) 303 d->destroy(d); 304 owl_free(d); 305 } 306 } 307 } 308 } 309 310 void owl_select_io_dispatch_gc(void) 311 { 312 int i; 313 owl_list *dl; 314 315 dl = owl_global_get_io_dispatch_list(&g); 316 /* 317 * Count down so we aren't set off by removing items from the list 318 * during the iteration. 319 */ 320 for(i = owl_list_get_size(dl) - 1; i >= 0; i--) { 321 owl_io_dispatch *d = owl_list_get_element(dl, i); 322 if(d->needs_gc) { 323 owl_select_remove_io_dispatch(d); 324 } 325 } 326 } 327 328 /* Each FD may have at most one dispatcher. 329 * If a new dispatch is added for an FD, the old one is removed. 330 * mode determines what types of events are watched for, and may be any combination of: 331 * OWL_IO_READ, OWL_IO_WRITE, OWL_IO_EXCEPT 332 */ 333 const owl_io_dispatch *owl_select_add_io_dispatch(int fd, int mode, void (*cb)(const owl_io_dispatch *, void *), void (*destroy)(const owl_io_dispatch *), void *data) 334 { 335 owl_io_dispatch *d = owl_malloc(sizeof(owl_io_dispatch)); 336 owl_list *dl = owl_global_get_io_dispatch_list(&g); 337 338 d->fd = fd; 339 d->needs_gc = 0; 340 d->mode = mode; 341 d->callback = cb; 342 d->destroy = destroy; 343 d->data = data; 344 345 owl_select_remove_io_dispatch(owl_select_find_io_dispatch_by_fd(fd)); 346 owl_list_append_element(dl, d); 347 348 return d; 349 } 350 351 int owl_select_prepare_io_dispatch_fd_sets(fd_set *rfds, fd_set *wfds, fd_set *efds) { 352 int i, len, max_fd; 353 owl_io_dispatch *d; 354 owl_list *dl = owl_global_get_io_dispatch_list(&g); 355 356 max_fd = 0; 357 len = owl_list_get_size(dl); 358 for (i = 0; i < len; i++) { 359 d = owl_list_get_element(dl, i); 360 if (d->mode & (OWL_IO_READ | OWL_IO_WRITE | OWL_IO_EXCEPT)) { 361 if (max_fd < d->fd) max_fd = d->fd; 362 if (d->mode & OWL_IO_READ) FD_SET(d->fd, rfds); 363 if (d->mode & OWL_IO_WRITE) FD_SET(d->fd, wfds); 364 if (d->mode & OWL_IO_EXCEPT) FD_SET(d->fd, efds); 365 } 366 } 367 return max_fd + 1; 368 } 369 370 void owl_select_io_dispatch(const fd_set *rfds, const fd_set *wfds, const fd_set *efds, const int max_fd) 371 { 372 int i, len; 373 owl_io_dispatch *d; 374 owl_list *dl = owl_global_get_io_dispatch_list(&g); 375 376 dispatch_active = 1; 377 len = owl_list_get_size(dl); 378 for (i = 0; i < len; i++) { 379 d = owl_list_get_element(dl, i); 380 if (d->fd < max_fd && d->callback != NULL && 381 ((d->mode & OWL_IO_READ && FD_ISSET(d->fd, rfds)) || 382 (d->mode & OWL_IO_WRITE && FD_ISSET(d->fd, wfds)) || 383 (d->mode & OWL_IO_EXCEPT && FD_ISSET(d->fd, efds)))) { 384 d->callback(d, d->data); 385 } 386 } 387 dispatch_active = 0; 388 owl_select_io_dispatch_gc(); 389 } 390 391 int owl_select_add_perl_io_dispatch(int fd, int mode, SV *cb) 392 { 393 const owl_io_dispatch *d = owl_select_find_io_dispatch_by_fd(fd); 394 if (d != NULL && d->callback != owl_perlconfig_io_dispatch) { 395 /* Don't mess with non-perl dispatch functions from here. */ 396 return 1; 397 } 398 owl_select_add_io_dispatch(fd, mode, owl_perlconfig_io_dispatch, owl_perlconfig_io_dispatch_destroy, cb); 399 return 0; 400 } 401 402 int owl_select_remove_perl_io_dispatch(int fd) 403 { 404 const owl_io_dispatch *d = owl_select_find_io_dispatch_by_fd(fd); 405 if (d != NULL && d->callback == owl_perlconfig_io_dispatch) { 406 /* Only remove perl io dispatchers from here. */ 407 owl_select_remove_io_dispatch(d); 408 return 0; 409 } 410 return 1; 411 } 412 262 413 int owl_select_aim_hack(fd_set *rfds, fd_set *wfds) 263 414 { … … 266 417 int max_fd; 267 418 268 FD_ZERO(rfds);269 FD_ZERO(wfds);270 419 max_fd = 0; 271 420 sess = owl_global_get_aimsess(&g); … … 414 563 void owl_select(void) 415 564 { 416 int i, max_fd, aim_max_fd, aim_done, ret;565 int i, max_fd, max_fd2, aim_done, ret; 417 566 fd_set r; 567 fd_set w; 418 568 fd_set e; 419 569 fd_set aim_rfds, aim_wfds; … … 430 580 return; 431 581 } 582 FD_ZERO(&r); 583 FD_ZERO(&w); 584 FD_ZERO(&e); 432 585 433 586 max_fd = owl_select_dispatch_prepare_fd_sets(&r, &e); 587 max_fd2 = owl_select_prepare_io_dispatch_fd_sets(&r, &w, &e); 588 if (max_fd < max_fd2) max_fd = max_fd2; 434 589 435 590 /* AIM HACK: … … 448 603 if (owl_global_is_doaimevents(&g)) { 449 604 aim_done = 0; 450 aim_max_fd= owl_select_aim_hack(&aim_rfds, &aim_wfds);451 if (max_fd < aim_max_fd) max_fd = aim_max_fd;452 for(i = 0; i <= aim_max_fd; i++) {605 max_fd2 = owl_select_aim_hack(&aim_rfds, &aim_wfds); 606 if (max_fd < max_fd2) max_fd = max_fd2; 607 for(i = 0; i <= max_fd2; i++) { 453 608 if (FD_ISSET(i, &aim_rfds)) { 454 609 FD_SET(i, &r); 455 610 FD_SET(i, &e); 456 611 } 612 if (FD_ISSET(i, &aim_wfds)) { 613 FD_SET(i, &w); 614 FD_SET(i, &e); 615 } 457 616 } 458 617 } … … 464 623 } 465 624 466 ret = pselect(max_fd+1, &r, & aim_wfds, &e, &timeout, &mask);625 ret = pselect(max_fd+1, &r, &w, &e, &timeout, &mask); 467 626 468 627 if(ret < 0 && errno == EINTR) { … … 482 641 /* Merge all interesting FDs into one set, since we have a 483 642 single dispatch per FD. */ 484 if (FD_ISSET(i, &r) || FD_ISSET(i, & aim_wfds) || FD_ISSET(i, &e)) {643 if (FD_ISSET(i, &r) || FD_ISSET(i, &w) || FD_ISSET(i, &e)) { 485 644 /* AIM HACK: no separate dispatch, just process here if 486 645 needed, and only once per run through. */ … … 497 656 and read ready FDs. */ 498 657 owl_select_dispatch(&r, max_fd); 499 } 500 } 658 owl_select_io_dispatch(&r, &w, &e, max_fd); 659 } 660 }
Note: See TracChangeset
for help on using the changeset viewer.