]> Cypherpunks.ru repositories - goredo.git/commitdiff
Reduce number of opened files while waiting for job slot v1.2.0
authorSergey Matveev <stargrave@stargrave.org>
Thu, 28 Jan 2021 18:14:00 +0000 (21:14 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Fri, 29 Jan 2021 08:12:25 +0000 (11:12 +0300)
doc/news.texi
run.go

index 7f67ba9e52832621770fee1979bdf0c3ef6f5ddd..56b537d7d81f9b62f88fe3d13ba16948a2a575fe 100644 (file)
@@ -8,6 +8,9 @@
     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 25e8bacebf3e20e88174412a51b5e50b0a0bc688..af17eaa415a66df05439c3919a5ccac79ee6147a 100644 (file)
--- a/run.go
+++ b/run.go
@@ -246,6 +246,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                lockRelease()
                return TgtErr{tgtOrig, err}
        }
+       fdDepPath := fdDep.Name()
        cleanup := func() {
                lockRelease()
                fdDep.Close()
@@ -292,6 +293,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                cleanup()
                return TgtErr{tgtOrig, err}
        }
+       fdDep.Close()
        trace(CWait, "%s", runErr.Name())
 
        // Prepare command line
@@ -316,7 +318,9 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                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 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
 
        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 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
        ))
 
        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 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
        }
 
        // 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 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                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 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                        }
                        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