+
+func isOODWithTrace(tgt *Tgt, level int, seen map[string]*Tgt) (bool, error) {
+ _, ood := OODTgts[tgt.a]
+ var err error
+ if ood {
+ if !isOODByBuildUUID(tgt) {
+ tracef(CDebug, "ood: %s%s -> already built", strings.Repeat(". ", level), tgt)
+ return false, nil
+ }
+ tracef(CDebug, "ood: %s%s true, external decision", strings.Repeat(". ", level), tgt)
+ goto RecordOODTgt
+ }
+ ood, err = isOOD(tgt, level, seen)
+ if !ood {
+ return ood, err
+ }
+RecordOODTgt:
+ flock := unix.Flock_t{
+ Type: unix.F_WRLCK,
+ Whence: io.SeekStart,
+ }
+ if err = unix.FcntlFlock(FdOODTgtsLock.Fd(), unix.F_SETLKW, &flock); err != nil {
+ log.Fatal(err)
+ }
+ if _, err = FdOODTgts.Seek(0, io.SeekEnd); err != nil {
+ log.Fatal(err)
+ }
+ if _, err := FdOODTgts.WriteString(tgt.a + "\x00"); err != nil {
+ log.Fatal(err)
+ }
+ flock.Type = unix.F_UNLCK
+ if err = unix.FcntlFlock(FdOODTgtsLock.Fd(), unix.F_SETLK, &flock); err != nil {
+ log.Fatal(err)
+ }
+ return true, nil
+}
+
+func oodTgtsClear() {
+ var err error
+ flock := unix.Flock_t{
+ Type: unix.F_WRLCK,
+ Whence: io.SeekStart,
+ }
+ if err = unix.FcntlFlock(FdOODTgtsLock.Fd(), unix.F_SETLKW, &flock); err != nil {
+ log.Fatal(err)
+ }
+ if err = FdOODTgts.Truncate(0); err != nil {
+ log.Fatal(err)
+ }
+ flock.Type = unix.F_UNLCK
+ if err = unix.FcntlFlock(FdOODTgtsLock.Fd(), unix.F_SETLK, &flock); err != nil {
+ log.Fatal(err)
+ }
+}