/*
-goredo -- redo implementation on pure Go
-Copyright (C) 2020 Sergey Matveev <stargrave@stargrave.org>
+goredo -- djb's redo implementation on pure Go
+Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
import (
"flag"
+ "fmt"
"log"
"os"
"os/signal"
jsTokens int
jsTokensM sync.Mutex
- flagJobs = flag.Uint64("j", 1, "number of parallel jobs (0=inf) (REDO_JOBS)")
+ flagJobs = flag.Int("j", -1, fmt.Sprintf("number of parallel jobs (0=inf, <0=1) (%s)", EnvJobs))
)
func jsInit() {
return
}
- var jobs uint64
- if v := os.Getenv(EnvJobs); v != "" {
- var err error
+ jobs := uint64(1)
+ var err error
+ if *flagJobs == 0 {
+ jobs = 0
+ } else if *flagJobs > 0 {
+ jobs = uint64(*flagJobs)
+ } else if v := os.Getenv(EnvJobs); v != "" {
jobs, err = strconv.ParseUint(v, 10, 64)
if err != nil {
log.Fatalln("can not parse", EnvJobs, err)
}
- } else {
- jobs = *flagJobs
}
if jobs == 0 {
// infinite jobs
return
}
- var err error
JSR, JSW, err = os.Pipe()
if err != nil {
- panic(err)
+ log.Fatalln(err)
}
for i := uint64(0); i < jobs; i++ {
jsRelease("initial fill")
func jsReleaseNoLock() {
if n, err := JSW.Write([]byte{0}); err != nil || n != 1 {
- panic("can not write JSW")
+ log.Fatalln("can not write JSW:", err)
}
}
}
trace(CJS, "acquire for %s", ctx)
if n, err := JSR.Read([]byte{0}); err != nil || n != 1 {
- panic("can not read JSR")
+ log.Fatalln("can not read JSR:", err)
}
jsTokensM.Lock()
jsTokens++