| | 480 | | pl_startup(num, hostlist) |
| | 481 | | int num; |
| | 482 | | struct hst **hostlist; |
| | 483 | | { |
| | 484 | | int nxth = 0; |
| | 485 | | struct slot *slact = 0; |
| | 486 | | struct hst *hp; |
| | 487 | | struct slot *sp, *sp2; |
| | 488 | | struct timeval tnow; |
| | 489 | | struct timeval tout; |
| | 490 | | #ifdef FDSETNOTSTRUCT |
| | 491 | | fd_set rfds; |
| | 492 | | #else |
| | 493 | | struct fd_set rfds; |
| | 494 | | #endif |
| | 495 | | int nfds; |
| | 496 | | int i; |
| | 497 | | int n; |
| | 498 | | char *p; |
| | 499 | | |
| | 500 | | |
| | 501 | | |
| | 502 | | slfree = &slots[RSHNPLL+1];
|
| | 503 | | slfree->s_link = slfree->s_rlink = slfree; |
| | 504 | | slact = &slots[RSHNPLL];
|
| | 505 | | slact->s_link = slact->s_rlink = slact; |
| | 506 | | for (i = RSHNPLL; i-- > 0; ) {
|
| | 507 | | LISTPUTAFTER(slfree, &slots[i], s_link, s_rlink);
|
| | 508 | | } |
| | 509 | | |
| | 510 | | |
| | 511 | | |
| | 512 | | |
| | 513 | | |
| | 514 | | for (; ; ) { |
| | 515 | | |
| | 516 | | |
| | 517 | | |
| | 518 | | |
| | 519 | | |
| | 520 | | for (; ; ) { |
| | 521 | | |
| | 522 | | |
| | 523 | | |
| | 524 | | if (slfree->s_link != slfree && nxth < num) |
| | 525 | | hp = hostlist[nxth++]; |
| | 526 | | else |
| | 527 | | break; |
| | 528 | | |
| | 529 | | sp = slfree->s_link; |
| | 530 | | LISTDELETE(sp, s_link, s_rlink);
|
| | 531 | | sp->s_hst = hp; |
| | 532 | | sp->s_len = 0; |
| | 533 | | sp->s_elen = 0; |
| | 534 | | if (pvmdebmask & PDMSTARTUP) {
|
| | 535 | | pvmlogprintf("pl_startup() trying %s\n", hp->h_name); |
| | 536 | | } |
| | 537 | | phase1(sp); |
| | 538 | | if (hp->h_result) { |
| | 539 | | |
| | 540 | | |
| | 541 | | if (pvmdebmask & PDMSTARTUP) {
|
| | 542 | | pvmlogprintf( |
| | 543 | | "pl_startup() got result \"%s\" for %s phase1()\n", |
| | 544 | | hp->h_result, hp->h_name); |
| | 545 | | } |
| | 546 | | |
| | 547 | | LISTPUTBEFORE(slfree, sp, s_link, s_rlink);
|
| | 548 | | |
| | 549 | | } else { |
| | 550 | | |
| | 551 | | |
| | 552 | | LISTPUTBEFORE(slact, sp, s_link, s_rlink);
|
| | 553 | | pvmgetclock(&sp->s_bail); |
| | 554 | | tout.tv_sec = RSHTIMEOUT;
|
| | 555 | | tout.tv_usec = 0; |
| | 556 | | TVXADDY(&sp->s_bail, &sp->s_bail, &tout);
|
| | 557 | | } |
| | 558 | | } |
| | 559 | | |
| | 560 | | |
| | 561 | | |
| | 562 | | if (slact->s_link == slact) |
| | 563 | | break; |
| | 564 | | |
| | 565 | | |
| | 566 | | |
| | 567 | | |
| | 568 | | |
| | 569 | | FD_ZERO(&rfds);
|
| | 570 | | nfds = 0; |
| | 571 | | TVCLEAR(&tout);
|
| | 572 | | pvmgetclock(&tnow); |
| | 573 | | for (sp = slact->s_link; sp != slact; sp = sp->s_link) { |
| | 574 | | if (TVXLTY(&sp->s_bail, &tnow)) {
|
| | 575 | | pvmlogprintf("pl_startup() giving up on host %s after %d secs\n", |
| | 576 | | sp->s_hst->h_name, RSHTIMEOUT);
|
| true | 577 | | sp->s_hst->h_result = STRALLOC("PvmCantStart");
|
| | 578 | | sp2 = sp->s_rlink; |
| | 579 | | close_slot(sp); |
| | 580 | | sp = sp2; |
| | 581 | | continue; |
| | 582 | | } |
| | 583 | | |
| | 584 | | if (!TVISSET(&tout) || TVXLTY(&sp->s_bail, &tout))
|
| | 585 | | tout = sp->s_bail; |
| | 586 | | if (sp->s_rfd >= 0) |
| | 587 | | FD_SET(sp->s_rfd, &rfds);
|
| | 588 | | if (sp->s_rfd > nfds) |
| | 589 | | nfds = sp->s_rfd; |
| | 590 | | if (sp->s_efd >= 0) |
| | 591 | | FD_SET(sp->s_efd, &rfds);
|
| | 592 | | if (sp->s_efd > nfds) |
| | 593 | | nfds = sp->s_efd; |