doc/news.texi | 3 +++ run.go | 46 +++++++++++++++++++++++++++++++++------------- diff --git a/doc/news.texi b/doc/news.texi index 44fca6e2609c4422edbf7c7cb7a6f924edcbd5851076497a10ea2d452e9030d8..ad51e4de56436a19cb80abbdc2c665ee5fb913811dd003d85833c909c80dce0e 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -8,6 +8,9 @@ @item Dependency files @file{.dep} extension changed to @file{.rec}, to reflect its recfile format nature and editors file type better determination. +@item + Reduce number of file descriptors kept open (1 instead of 4) while + waiting for job slot token. @end itemize @anchor{Release 1.1.0} diff --git a/run.go b/run.go index 7207a29b096081bc9abaeff4b71dedc054b653ad6463f7c2774e803ee458cfd6..bb231dda450131a578ea4dfa3970dd8e16253ed9e97038ef1b15e65bb09b3a2c 100644 --- a/run.go +++ b/run.go @@ -246,6 +246,7 @@ if err != nil { lockRelease() return TgtErr{tgtOrig, err} } + fdDepPath := fdDep.Name() cleanup := func() { lockRelease() fdDep.Close() @@ -292,6 +293,7 @@ if err = writeDep(fdDep, cwdOrig, doFileRelPath); err != nil { cleanup() return TgtErr{tgtOrig, err} } + fdDep.Close() trace(CWait, "%s", runErr.Name()) // Prepare command line @@ -316,7 +318,9 @@ if err != nil { cleanup() return TgtErr{tgtOrig, err} } - tmpPath := fdStdout.Name() + ".3" // and for $3 + stdoutPath := fdStdout.Name() + fdStdout.Close() + tmpPath := stdoutPath + ".3" // and for $3 tmpPathRel, err := filepath.Rel(cwd, tmpPath) if err != nil { panic(err) @@ -330,7 +334,6 @@ ) cmd := exec.Command(cmdName, args...) cmd.Dir = cwd - cmd.Stdout = fdStdout // cmd.Stdin reads from /dev/null by default cmd.Env = append(os.Environ(), fmt.Sprintf("%s=%d", EnvLevel, Level+1)) cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDirPrefix, dirPrefix)) @@ -342,10 +345,6 @@ "%s=%s", EnvStderrPrefix, childStderrPrefix, )) fdNum := 0 - cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep) - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvDepFd, 3+fdNum)) - fdNum++ - if FdStatus == nil { cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvStatusFd)) } else { @@ -367,10 +366,6 @@ fdNum += 2 } // Preparing stderr - stderr, err := cmd.StderrPipe() - if err != nil { - panic(err) - } var fdStderr *os.File if StderrKeep { fdStderr, err = os.OpenFile( @@ -396,6 +391,26 @@ jsAcquire(shCtx) if FdStatus != nil { FdStatus.Write([]byte{StatusRun}) } + + started := time.Now() + runErr.Started = &started + fdStdout, err = os.OpenFile(stdoutPath, os.O_RDWR, os.FileMode(0666)) + if err != nil { + runErr.Err = err + errs <- runErr + return + } + cmd.Stdout = fdStdout + fdDep, err = os.OpenFile(fdDepPath, os.O_WRONLY|os.O_APPEND, os.FileMode(0666)) + if err != nil { + runErr.Err = err + errs <- runErr + return + } + cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep) + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvDepFd, 3+fdNum)) + fdNum++ + defer func() { jsRelease(shCtx) lockRelease() @@ -413,9 +428,14 @@ FdStatus.Write([]byte{StatusDone}) } Jobs.Done() }() - started := time.Now() - runErr.Started = &started - err := cmd.Start() + stderr, err := cmd.StderrPipe() + if err != nil { + runErr.Err = err + errs <- runErr + return + } + started = time.Now() + err = cmd.Start() if err != nil { runErr.Err = err errs <- runErr