| 118 | } |
| 119 | |
| 120 | func (p *VMPool) Return(_ context.Context, vm *VM) error { |
| 121 | if vm == nil { |
| 122 | return errors.New("cannot return a nil VM") |
| 123 | } |
| 124 | vm.DisposeDisposables() |
| 125 | |
| 126 | p.mu.Lock() |
| 127 | if p.closed || len(p.idle) >= p.config.MaxIdle { |
| 128 | p.total-- |
| 129 | p.signalLocked() |
| 130 | p.mu.Unlock() |
| 131 | return vm.Dispose() |
| 132 | } |
| 133 | p.idle = append(p.idle, idleVM{vm: vm, returnedAt: time.Now()}) |
| 134 | p.signalLocked() |
| 135 | p.mu.Unlock() |
| 136 | return nil |
| 137 | } |
| 138 | |
| 139 | func (p *VMPool) Dispose() error { |
| 140 | p.stopOnce.Do(func() { close(p.stop) }) |