diff --git a/pool.go b/pool.go index 2dcf186..497d4cf 100644 --- a/pool.go +++ b/pool.go @@ -217,11 +217,12 @@ func (p *Pool) Submit(task func()) error { if p.IsClosed() { return ErrPoolClosed } - if w := p.retrieveWorker(); w != nil { + + w, err := p.retrieveWorker() + if w != nil { w.inputFunc(task) - return nil } - return ErrPoolOverload + return err } // Running returns the number of workers currently running. @@ -328,7 +329,7 @@ func (p *Pool) addWaiting(delta int) { } // retrieveWorker returns an available worker to run the tasks. -func (p *Pool) retrieveWorker() (w worker) { +func (p *Pool) retrieveWorker() (w worker, err error) { p.lock.Lock() retry: @@ -350,7 +351,7 @@ retry: // Bail out early if it's in nonblocking mode or the number of pending callers reaches the maximum limit value. if p.options.Nonblocking || (p.options.MaxBlockingTasks != 0 && p.Waiting() >= p.options.MaxBlockingTasks) { p.lock.Unlock() - return + return nil, ErrPoolOverload } // Otherwise, we'll have to keep them blocked and wait for at least one worker to be put back into pool. @@ -360,7 +361,7 @@ retry: if p.IsClosed() { p.lock.Unlock() - return + return nil, ErrPoolClosed } goto retry diff --git a/pool_func.go b/pool_func.go index ce8a0b1..413f187 100644 --- a/pool_func.go +++ b/pool_func.go @@ -223,11 +223,12 @@ func (p *PoolWithFunc) Invoke(args interface{}) error { if p.IsClosed() { return ErrPoolClosed } - if w := p.retrieveWorker(); w != nil { + + w, err := p.retrieveWorker() + if w != nil { w.inputParam(args) - return nil } - return ErrPoolOverload + return err } // Running returns the number of workers currently running. @@ -334,7 +335,7 @@ func (p *PoolWithFunc) addWaiting(delta int) { } // retrieveWorker returns an available worker to run the tasks. -func (p *PoolWithFunc) retrieveWorker() (w worker) { +func (p *PoolWithFunc) retrieveWorker() (w worker, err error) { p.lock.Lock() retry: @@ -356,7 +357,7 @@ retry: // Bail out early if it's in nonblocking mode or the number of pending callers reaches the maximum limit value. if p.options.Nonblocking || (p.options.MaxBlockingTasks != 0 && p.Waiting() >= p.options.MaxBlockingTasks) { p.lock.Unlock() - return + return nil, ErrPoolOverload } // Otherwise, we'll have to keep them blocked and wait for at least one worker to be put back into pool. @@ -366,7 +367,7 @@ retry: if p.IsClosed() { p.lock.Unlock() - return + return nil, ErrPoolClosed } goto retry