aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2017-12-15 16:05:17 -0800
committerLibravatar Terin Stock <terinjokes@gmail.com>2017-12-15 16:05:17 -0800
commit46d4d2492fc6c64fd0a16b0080383025565d6acf (patch)
tree453ab2520646ebfcb34f7fb1c1a4375317f42cd6 /main.go
parentchore(travis): run test stage (diff)
downloadbakelite-46d4d2492fc6c64fd0a16b0080383025565d6acf.tar.xz
feat: replace parallel with a semaphore
Diffstat (limited to 'main.go')
-rw-r--r--main.go96
1 files changed, 57 insertions, 39 deletions
diff --git a/main.go b/main.go
index ea2942c..a990cc3 100644
--- a/main.go
+++ b/main.go
@@ -11,7 +11,7 @@ import (
"path/filepath"
"runtime"
- "github.com/neelance/parallel"
+ "golang.org/x/sync/semaphore"
)
type Arch string
@@ -114,46 +114,64 @@ func main() {
os.Exit(-1)
}
- parallelJobs := runtime.NumCPU()
- par := parallel.NewRun(parallelJobs)
+ var (
+ parallelJobs = runtime.NumCPU()
+ sem = semaphore.NewWeighted(int64(parallelJobs))
+ out = make([]error, len(platforms)*len(packages))
+ ctx = context.Background()
+ )
+
fmt.Printf("info: running bakelite with %d jobs\n", parallelJobs)
- for _, platform := range platforms {
- for _, pkg := range packages {
- par.Acquire()
- go func(platform Platform, pkg string) {
- defer par.Release()
- name := fmt.Sprintf("%s-%s-%s", filepath.Base(pkg), platform.OS, platform.Arch)
- env := kvs{
- "GOOS": string(platform.OS),
- "GOARCH": string(platform.Arch),
- "GOROOT": os.Getenv("GOROOT"),
- "GOPATH": os.Getenv("GOPATH"),
- }
-
- if cgo {
- env["CGO_ENABLED"] = "1"
- } else {
- env["CGO_ENABLED"] = "0"
- }
-
- var stdout bytes.Buffer
- var stderr bytes.Buffer
-
- cmd := exec.CommandContext(context.Background(), "go", "build", "-o", name, pkg)
- cmd.Env = env.Strings()
- cmd.Stdout = &stdout
- cmd.Stderr = &stderr
-
- fmt.Printf("info: Running build for %s @ %s/%s…\n", pkg, platform.OS, platform.Arch)
- err := cmd.Run()
-
- if err != nil {
- log.Printf("fatal: There was an error! err='%s' stdout='%s' stderr='%s'", err, stdout.String(), stderr.String())
- os.Exit(-1)
- }
- }(platform, pkg)
+ for i, platform := range platforms {
+ for j, pkg := range packages {
+ if err := sem.Acquire(ctx, 1); err != nil {
+ log.Printf("failed to acquire semaphore: %s", err)
+ break
+ }
+
+ go func(i int, j int, platform Platform, pkg string) {
+ defer sem.Release(1)
+ out[i*j] = build(ctx, platform, pkg)
+ }(i, j, platform, pkg)
}
}
- par.Wait()
+
+ if err := sem.Acquire(ctx, int64(parallelJobs)); err != nil {
+ log.Printf("failed to acquire semaphore: %s", err)
+ }
+}
+
+func build(ctx context.Context, platform Platform, pkg string) error {
+ name := fmt.Sprintf("%s-%s-%s", filepath.Base(pkg), platform.OS, platform.Arch)
+
+ env := kvs{
+ "GOOS": string(platform.OS),
+ "GOARCH": string(platform.Arch),
+ "GOROOT": os.Getenv("GOROOT"),
+ "GOPATH": os.Getenv("GOPATH"),
+ }
+
+ if cgo {
+ env["CGO_ENABLED"] = "1"
+ } else {
+ env["CGO_ENABLED"] = "0"
+ }
+
+ var stdout bytes.Buffer
+ var stderr bytes.Buffer
+
+ cmd := exec.CommandContext(context.Background(), "go", "build", "-o", name, pkg)
+ cmd.Env = env.Strings()
+ cmd.Stdout = &stdout
+ cmd.Stderr = &stderr
+
+ fmt.Printf("info: Running build for %s @ %s/%s…\n", pkg, platform.OS, platform.Arch)
+ err := cmd.Run()
+
+ if err != nil {
+ log.Printf("fatal: There was an error! err='%s' stdout='%s' stderr='%s'", err, stdout.String(), stderr.String())
+ }
+
+ return err
}