doc/INSTALL | 2 +- doc/NEWS | 4 ++++ main.go | 1 + run.go | 37 ++++++++++++++++++++++++++++++------- usage.go | 2 +- diff --git a/doc/INSTALL b/doc/INSTALL index 49d97e2cadabd55a9a856e1175bc31ad5c3e187955ab64c1b2effa8624a25385..8e9018c88a4853c8b2f8cf57f02d541df7cdd303c1ad1089125dbfe9792bccad 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -11,7 +11,7 @@ => https://github.com/NixOS/nixpkgs/tree/master/pkgs/by-name/go/goredo NixOS packages Preferable way is to [Download] tarball with the signature from website: - $ v=2.9.0 + $ v=2.9.1 $ [fetch|wget] http://www.goredo.cypherpunks.su/download/goredo-$v.tar.zst $ [fetch|wget] http://www.goredo.cypherpunks.su/download/goredo-$v.tar.zst.{asc,sig,cm} [Integrity] verify diff --git a/doc/NEWS b/doc/NEWS index 6b5c1493fb688ed2ec867feee1eeda4ad6cf80b753efac40d2a3bc27105d0698..c0f7be028c654df43073aae41848804d1b5994ed0bc0e7a8c32a17d5e48e773e 100644 --- a/doc/NEWS +++ b/doc/NEWS @@ -1,3 +1,7 @@ +A 2.9.1 +2.9.1 + * Fix possible panic. + A 2.9.0 2.9.0 * Warn if non-top target did not write anything. diff --git a/main.go b/main.go index 8ebdadfdfaacb5d0574c90c1657c80b8d6ec30aaa52492121dbb56a31799a40a..a34d497cdc86502cff10fbec758e730e6b21c7b76b29ea834d073356835a0cca 100644 --- a/main.go +++ b/main.go @@ -318,6 +318,7 @@ signal.Notify(killed, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) go func() { <-killed tracef(CDebug, "[%s] killed", BuildUUID) + TmpsToCleanM.Lock() for fn := range TmpsToClean { tracef(CDebug, "[%s] clean tempfile: %s", BuildUUID, fn) os.Remove(fn) diff --git a/run.go b/run.go index 7617fb360ea76be7c4228414555f285019a60583fc45ce60be94f8d315002f3f..5ed615ac74031cfeeb1022dbdc4ae603a07912cb0984256349ba573f555660f6 100644 --- a/run.go +++ b/run.go @@ -71,6 +71,7 @@ StderrPrefix string StopIfMod = false Jobs sync.WaitGroup TmpsToClean = make(map[string]struct{}) + TmpsToCleanM sync.Mutex flagTrace *bool flagTraceAll *bool @@ -320,7 +321,11 @@ if err != nil { lockRelease() return TgtError{tgt, ErrLine(err)} } - TmpsToClean[fdDep.Name()] = struct{}{} + { + TmpsToCleanM.Lock() + TmpsToClean[fdDep.Name()] = struct{}{} + TmpsToCleanM.Unlock() + } fdDepOpened := true fdDepExists := true fdDepW := bufio.NewWriter(fdDep) @@ -330,7 +335,11 @@ if fdDepOpened { fdDep.Close() } if fdDepExists { - delete(TmpsToClean, fdDep.Name()) + { + TmpsToCleanM.Lock() + delete(TmpsToClean, fdDep.Name()) + TmpsToCleanM.Unlock() + } os.Remove(fdDep.Name()) } } @@ -410,7 +419,11 @@ if err != nil { cleanup() return TgtError{tgt, ErrLine(err)} } - TmpsToClean[fdStdout.Name()] = struct{}{} + { + TmpsToCleanM.Lock() + TmpsToClean[fdStdout.Name()] = struct{}{} + TmpsToCleanM.Unlock() + } fdStdout.Close() tmpPath := fdStdout.Name() + ".3" // and for $3 tmpPathRel := mustRel(cwd, tmpPath) @@ -611,13 +624,19 @@ } } lockRelease() if fdDepExists { - delete(TmpsToClean, fdDep.Name()) os.Remove(fdDep.Name()) } - delete(TmpsToClean, fdStdout.Name()) os.Remove(fdStdout.Name()) - delete(TmpsToClean, tmpPath) os.Remove(tmpPath) + { + TmpsToCleanM.Lock() + if fdDepExists { + delete(TmpsToClean, fdDep.Name()) + } + delete(TmpsToClean, fdStdout.Name()) + delete(TmpsToClean, tmpPath) + TmpsToCleanM.Unlock() + } if FdStatus != nil { if _, err = FdStatus.Write([]byte{StatusDone}); err != nil { log.Fatal(err) @@ -841,7 +860,11 @@ err = ErrLine(os.Rename(fdDep.Name(), tgt.dep)) if err != nil { goto Finish } - delete(TmpsToClean, fdDep.Name()) + { + TmpsToCleanM.Lock() + delete(TmpsToClean, fdDep.Name()) + TmpsToCleanM.Unlock() + } fdDepExists = false if !NoSync { err = ErrLine(syncDir(redoDir)) diff --git a/usage.go b/usage.go index 0681395e71ac8f7bb2da37b871efdf937a3f8665584d24c3df59b2c32fdee932..4088f2717fbcaa58e99c00ae8880b6108beedb7132b4a2d8e2b82e6366c180c4 100644 --- a/usage.go +++ b/usage.go @@ -24,7 +24,7 @@ "strings" ) const ( - Version = "2.9.0" + Version = "2.9.1" Warranty = `Copyright (C) 2020-2026 Sergey Matveev This program is free software: you can redistribute it and/or modify