| 75 | } |
| 76 | |
| 77 | func (l *freelist) close() error { |
| 78 | l.Lock() |
| 79 | defer l.Unlock() |
| 80 | close(l.freeCh) |
| 81 | var errmsgs []string |
| 82 | for s := range l.freeCh { |
| 83 | if err := s.Close(); err != nil { |
| 84 | errmsgs = append(errmsgs, err.Error()) |
| 85 | } |
| 86 | } |
| 87 | l.freeCh = nil // set to nil explicitly to force close in freelist.put |
| 88 | if len(errmsgs) > 0 { |
| 89 | return errors.Wrapf(errors.New(strings.Join(errmsgs, ", ")), "close free list %s", l.target) |
| 90 | } |
| 91 | return nil |
| 92 | } |
| 93 | |
| 94 | func (l *freelist) put(cli *rpc.Client) (err error) { |
| 95 | l.RLock() // note that this is read op on the freelist aspect |