import (
"bufio"
+ "crypto/rand"
+ "encoding/hex"
"errors"
"flag"
"fmt"
return TgtError{tgtOrig, err}
}
+ shCtx := fmt.Sprintf("sh: %s: cwd:%s", tgtOrig, cwd)
+ jsToken := jsAcquire(shCtx)
+ jsNeedsRelease := true
+ defer func() {
+ if jsNeedsRelease {
+ jsRelease(shCtx, jsToken)
+ }
+ }()
+
// Acquire lock
fdLock, err := os.OpenFile(
path.Join(redoDir, tgt+LockSuffix),
path.Join(dirPrefix, basename),
tmpPathRel,
)
+ shCtx = fmt.Sprintf(
+ "sh: %s: %s %s cwd:%s dirprefix:%s",
+ tgtOrig, cmdName, args, cwd, dirPrefix,
+ )
cmd := exec.Command(cmdName, args...)
cmd.Dir = cwd
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDirPrefix, dirPrefix))
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvBuildUUID, BuildUUID))
- childStderrPrefix := tempsuffix()
+ childStderrPrefixRaw := make([]byte, 8)
+ if _, err = io.ReadFull(rand.Reader, childStderrPrefixRaw); err != nil {
+ panic(err)
+ }
+ childStderrPrefix := hex.EncodeToString(childStderrPrefixRaw)
cmd.Env = append(cmd.Env, fmt.Sprintf(
"%s=%s", EnvStderrPrefix, childStderrPrefix,
))
return TgtError{tgtOrig, err}
}
}
- shCtx := fmt.Sprintf(
- "sh: %s: %s %s cwd:%s dirprefix:%s",
- tgtOrig, cmdName, args, cwd, dirPrefix,
- )
tracef(CDebug, "%s", shCtx)
+ jsNeedsRelease = false
Jobs.Add(1)
go func() {
- jsToken := jsAcquire(shCtx)
if JSR == nil {
// infinite jobs
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJobs))
}
}
+ defer jsRelease(shCtx, jsToken)
+
var finished time.Time
var exitErr *exec.ExitError
started := time.Now()
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDepCwd, cwd))
defer func() {
- jsRelease(shCtx, jsToken)
fdDep.Close()
fdStdout.Close()
if fdStderr != nil {