()
| 817 | } |
| 818 | |
| 819 | func (p *closeWorkerPool) workerPoolMain() { |
| 820 | cases := make([]reflect.SelectCase, len(p.workers)+2) |
| 821 | for { |
| 822 | // 0 - pool stopper stopc |
| 823 | // 1 - node ready for destroy |
| 824 | cases[0] = reflect.SelectCase{ |
| 825 | Dir: reflect.SelectRecv, |
| 826 | Chan: reflect.ValueOf(p.poolStopper.ShouldStop()), |
| 827 | } |
| 828 | cases[1] = reflect.SelectCase{ |
| 829 | Dir: reflect.SelectRecv, |
| 830 | Chan: reflect.ValueOf(p.ready), |
| 831 | } |
| 832 | for idx, w := range p.workers { |
| 833 | cases[2+idx] = reflect.SelectCase{ |
| 834 | Dir: reflect.SelectRecv, |
| 835 | Chan: reflect.ValueOf(w.completedC), |
| 836 | } |
| 837 | } |
| 838 | chosen, v, _ := reflect.Select(cases) |
| 839 | if chosen == 0 { |
| 840 | p.timedWait() |
| 841 | return |
| 842 | } else if chosen == 1 { |
| 843 | node := v.Interface().(closeReq).node |
| 844 | p.pending = append(p.pending, node) |
| 845 | } else if chosen > 1 && chosen < len(p.workers)+2 { |
| 846 | workerID := uint64(chosen - 2) |
| 847 | p.completed(workerID) |
| 848 | } else { |
| 849 | plog.Panicf("chosen %d, unknown case", chosen) |
| 850 | } |
| 851 | p.schedule() |
| 852 | } |
| 853 | } |
| 854 | |
| 855 | func (p *closeWorkerPool) timedWait() { |
| 856 | timer := time.NewTimer(timedCloseWait) |
no test coverage detected