doc/news.texi | 9 +++++++++ run.go | 22 ++++++++++++++++------ usage.go | 2 +- diff --git a/doc/news.texi b/doc/news.texi index f45817b6fa5cd89dc3cd15c8ac899f57ebaa11ec89e16b335bcf889bffcd1c69..cba7aeb5de2a92899f0c6d27c579f3c263d681ec7d686d06769fbc2b009187ab 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -2,6 +2,15 @@ @node News @cindex news @unnumbered News +@anchor{Release 1_25_0} +@section Release 1.25.0 +@itemize +@item + Target's lock file requires a token from the jobserver now. So + amount of simultaneously opened lock files depends on job slots + available. +@end itemize + @anchor{Release 1_24_0} @section Release 1.24.0 @itemize diff --git a/run.go b/run.go index 76d1427b0a4f03d2ad915794ef29d10aae638d427c65a77d8aa689bef81628cf..28cfeb6fe8a036df9f46da2ff551978bc2e416547af86bc193991245b8a4572b 100644 --- a/run.go +++ b/run.go @@ -194,6 +194,15 @@ if err := mkdirs(redoDir); err != nil { 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 +390,10 @@ path.Join(dirPrefix, tgt), 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 @@ -423,15 +436,11 @@ cleanup() 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)) @@ -452,6 +461,8 @@ if _, err = FdStatus.Write([]byte{StatusRun}); err != nil { log.Fatalln(err) } } + + defer jsRelease(shCtx, jsToken) var finished time.Time var exitErr *exec.ExitError @@ -483,7 +494,6 @@ fdNum++ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDepCwd, cwd)) defer func() { - jsRelease(shCtx, jsToken) fdDep.Close() fdStdout.Close() if fdStderr != nil { diff --git a/usage.go b/usage.go index 1cdcf78828190361723be4693fb95cfa8b9b2ed4b02b7ceedb87b95dcba40fe7..6b5089568d9bf5b28039459b22e79929e752d0dc44abbd15b54a131169da7b82 100644 --- a/usage.go +++ b/usage.go @@ -24,7 +24,7 @@ "os" ) const ( - Version = "1.24.0" + Version = "1.25.0" Warranty = `Copyright (C) 2020-2022 Sergey Matveev This program is free software: you can redistribute it and/or modify