diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2020-10-07 15:06:02 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-07 15:06:02 -0400 |
commit | 0e1d01103e45430693736dac10be13c49cf23f03 (patch) | |
tree | aed0f84e88d4e4de22b5e262761e95c951f4f610 /pkg/parallel/parallel.go | |
parent | 9ae873e60e149677db66782eaf2b4ed1402e97d2 (diff) | |
parent | 55f5e4af11a2428b14b36bbdcd4b1d91e868d786 (diff) | |
download | podman-0e1d01103e45430693736dac10be13c49cf23f03.tar.gz podman-0e1d01103e45430693736dac10be13c49cf23f03.tar.bz2 podman-0e1d01103e45430693736dac10be13c49cf23f03.zip |
Merge pull request #7382 from mheon/pod_parallel
Move pod jobs to parallel execution
Diffstat (limited to 'pkg/parallel/parallel.go')
-rw-r--r-- | pkg/parallel/parallel.go | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/pkg/parallel/parallel.go b/pkg/parallel/parallel.go index c9e4da50d..4da7e0f89 100644 --- a/pkg/parallel/parallel.go +++ b/pkg/parallel/parallel.go @@ -1,6 +1,7 @@ package parallel import ( + "context" "sync" "github.com/pkg/errors" @@ -42,3 +43,32 @@ func SetMaxThreads(threads uint) error { func GetMaxThreads() uint { return numThreads } + +// Enqueue adds a single function to the parallel jobs queue. This function will +// be run when an unused thread is available. +// Returns a receive-only error channel that will return the error (if any) from +// the provided function fn when fn has finished executing. The channel will be +// closed after this. +func Enqueue(ctx context.Context, fn func() error) <-chan error { + retChan := make(chan error) + + go func() { + jobControlLock.RLock() + defer jobControlLock.RUnlock() + + defer close(retChan) + + if err := jobControl.Acquire(ctx, 1); err != nil { + retChan <- errors.Wrapf(err, "error acquiring job control semaphore") + return + } + + err := fn() + + jobControl.Release(1) + + retChan <- err + }() + + return retChan +} |