+
+func isOODWithTrace(
+ cwd, tgtOrig string,
+ level int,
+ seen map[string]struct{},
+) (bool, error) {
+ p, err := filepath.Abs(path.Join(cwd, tgtOrig))
+ if err != nil {
+ panic(err)
+ }
+ _, ood := OODTgts[p]
+ if ood {
+ if !isOODByBuildUUID(cwd, tgtOrig) {
+ trace(
+ CDebug,
+ "ood: %s%s -> already built",
+ strings.Repeat(". ", level), tgtOrig,
+ )
+ return false, nil
+ }
+ trace(
+ CDebug,
+ "ood: %s%s true, external decision",
+ strings.Repeat(". ", level), tgtOrig,
+ )
+ goto RecordOODTgt
+ }
+ ood, err = isOOD(cwd, tgtOrig, level, seen)
+ if !ood {
+ return ood, err
+ }
+RecordOODTgt:
+ if err = unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_EX); err != nil {
+ log.Fatalln(err)
+ }
+ if _, err = FdOODTgts.Seek(0, io.SeekEnd); err != nil {
+ log.Fatalln(err)
+ }
+ if _, err := FdOODTgts.WriteString(p + "\x00"); err != nil {
+ log.Fatalln(err)
+ }
+ unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_UN)
+ return true, nil
+}
+
+func oodTgtsClear() {
+ if err := unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_EX); err != nil {
+ log.Fatalln(err)
+ }
+ if err := FdOODTgts.Truncate(0); err != nil {
+ log.Fatalln(err)
+ }
+ unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_UN)
+}