| | 660 | | task_cleanup(tp) |
| | 661 | | struct task *tp; |
| | 662 | | { |
| | 663 | | struct pmsg *mp; |
| | 664 | | struct waitc *wp, *wp2; |
| | 665 | | struct task *tp2; |
| | 666 | | struct pvmmentry *ep; |
| | 667 | | struct hostd *hp; |
| | 668 | | struct pmsg *mpd; |
| | 669 | | char buf[512]; |
| | 670 | | int hh; |
| | 671 | | |
| | 672 | | |
| | 673 | | |
| | 674 | | if (tp->t_tid) { |
| | 675 | | if (pvmdebmask & PDMTASK)
|
| | 676 | | pvmlogprintf("task_cleanup() t%x\n", tp->t_tid); |
| | 677 | | |
| | 678 | | for (wp = waitlist->wa_link; wp != waitlist; wp = wp->wa_link) { |
| | 679 | | |
| | 680 | | |
| | 681 | | |
| | 682 | | if (wp->wa_on == tp->t_tid) { |
| | 683 | | switch (wp->wa_kind) { |
| | 684 | | |
| | 685 | | case WT_HOSTSTART:
|
| | 686 | | busyadding = 0; |
| | 687 | | free_waitc_add((struct waitc_add *)wp->wa_spec); |
| | 688 | | pkint(wp->wa_mesg, PvmDSysErr);
|
| | 689 | | sendmessage(wp->wa_mesg); |
| | 690 | | wp->wa_mesg = 0; |
| | 691 | | if (pvmdebmask & (PDMTASK|PDMSTARTUP))
|
| | 692 | | pvmlogprintf( |
| | 693 | | "task_cleanup() hoster t%x takes wid %d with it\n", |
| | 694 | | tp->t_tid, wp->wa_wid); |
| | 695 | | break; |
| | 696 | | |
| | 697 | | case WT_TASKSTART:
|
| | 698 | | if (wp->wa_tid) { |
| | 699 | | if (pvmdebmask & PDMTASK) {
|
| | 700 | | pvmlogprintf( |
| | 701 | | "task_cleanup() tasker t%x takes t%x with it\n", |
| | 702 | | tp->t_tid, wp->wa_tid); |
| | 703 | | } |
| | 704 | | if (tp2 = task_find(wp->wa_tid)) { |
| | 705 | | wp->wa_tid = 0; |
| | 706 | | task_cleanup(tp2); |
| | 707 | | task_free(tp2); |
| | 708 | | } |
| | 709 | | } |
| | 710 | | break; |
| | 711 | | |
| | 712 | | case WT_TASKX:
|
| | 713 | | if (wp->wa_tid && wp->wa_mesg) { |
| | 714 | | sendmessage(wp->wa_mesg); |
| | 715 | | wp->wa_mesg = 0; |
| | 716 | | } |
| | 717 | | mb_tidy(tp->t_tid); |
| | 718 | | break; |
| | 719 | | |
| | 720 | | case WT_RESET:
|
| | 721 | | if (wp->wa_tid && wp->wa_mesg) { |
| | 722 | | sendmessage(wp->wa_mesg); |
| | 723 | | wp->wa_mesg = 0; |
| | 724 | | } |
| | 725 | | mb_tidy_reset(tp->t_tid); |
| | 726 | | break; |
| | 727 | | |
| | 728 | | case WT_RECVINFO:
|
| | 729 | | |
| | 730 | | ep = (struct pvmmentry *) wp->wa_spec; |
| | 731 | | if ( ep->me_msg ) |
| | 732 | | PVM_FREE( ep->me_msg );
|
| | 733 | | PVM_FREE( ep );
|
| | 734 | | break; |
| | 735 | | |
| | 736 | | case WT_HOSTA:
|
| | 737 | | break; |
| | 738 | | |
| | 739 | | default: |
| | 740 | | pvmlogprintf( |
| | 741 | | "task_cleanup() can't deal with wait kind %d\n", |
| | 742 | | wp->wa_kind); |
| | 743 | | break; |
| | 744 | | } |
| | 745 | | wp2 = wp; |
| | 746 | | wp = wp->wa_rlink; |
| | 747 | | wait_delete(wp2); |
| | 748 | | continue; |
| | 749 | | } |
| | 750 | | |
| | 751 | | |
| | 752 | | |
| | 753 | | if (wp->wa_tid == tp->t_tid) { |
| | 754 | | switch (wp->wa_kind) { |
| | 755 | | |
| | 756 | | case WT_HOSTF:
|
| | 757 | | case WT_HOSTA:
|
| | 758 | | case WT_TASKX:
|
| | 759 | | case WT_ROUTEA:
|
| | 760 | | case WT_ROUTED:
|
| | 761 | | case WT_TASKSTART:
|
| | 762 | | wp2 = wp; |
| | 763 | | wp = wp->wa_rlink; |
| | 764 | | wait_delete(wp2); |
| | 765 | | break; |
| | 766 | | |
| | 767 | | default: |
| | 768 | | wp->wa_tid = 0; |
| | 769 | | break; |
| | 770 | | } |
| | 771 | | } |
| | 772 | | } |
| | 773 | | |
| | 774 | | |
| | 775 | | |
| | 776 | | if ((tp->t_sched)&&(tp->t_schedlmsg!=SM_TASKX)) {
|