X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=run.go;h=8cb6017d7d5ee3547a9bb0fd59d8a180135fa0c8;hb=042cb9cb12ae5c294a0ae6e7fa425b3a90b676ca;hp=c0d6eda2fd0f31920d13034e28592fa05ace013c;hpb=b3631f17ba7427e538e8f6bd84ac4ead1aaab3f2;p=goredo.git diff --git a/run.go b/run.go index c0d6eda..8cb6017 100644 --- a/run.go +++ b/run.go @@ -21,6 +21,8 @@ package main import ( "bufio" + "crypto/rand" + "encoding/hex" "errors" "flag" "fmt" @@ -194,6 +196,15 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { 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), @@ -381,6 +392,10 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { 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 @@ -389,7 +404,11 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { 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, )) @@ -423,15 +442,11 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { 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)) @@ -453,6 +468,8 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { } } + defer jsRelease(shCtx, jsToken) + var finished time.Time var exitErr *exec.ExitError started := time.Now() @@ -483,7 +500,6 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDepCwd, cwd)) defer func() { - jsRelease(shCtx, jsToken) fdDep.Close() fdStdout.Close() if fdStderr != nil {