]> Cypherpunks.ru repositories - goredo.git/blobdiff - run.go
Warn about several unsuccessful lock attempts
[goredo.git] / run.go
diff --git a/run.go b/run.go
index 2e5dbf5f7ebd5fc8e9c4cfc6e8194333b0456fd9..566f7adbab83e52a191ed2498777d26267630bff 100644 (file)
--- a/run.go
+++ b/run.go
@@ -184,7 +184,7 @@ func syncDir(dir string) error {
        return err
 }
 
-func runScript(tgtOrig string, errs chan error, traced bool) error {
+func runScript(tgtOrig string, errs chan error, forced, traced bool) error {
        cwd, tgt := cwdAndTgt(tgtOrig)
        redoDir := path.Join(cwd, RedoDir)
        if err := mkdirs(redoDir); err != nil {
@@ -242,10 +242,14 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                go func() {
                        defer Jobs.Done()
                        tracef(CLock, "LOCK_EX: %s", fdLock.Name())
+                       takeTries := 0
                LockAgain:
                        if err := unix.FcntlFlock(fdLock.Fd(), unix.F_SETLKW, &flock); err != nil {
-                               log.Println(err, fdLock.Name())
                                time.Sleep(10 * time.Millisecond)
+                               takeTries++
+                               if takeTries%10 == 0 {
+                                       log.Println(err, fdLock.Name(), "after", takeTries, "attempts")
+                               }
                                goto LockAgain
                        }
                        lockRelease()
@@ -281,6 +285,19 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                return nil
        }
 
+       // Check if it was already built in parallel
+       if !forced {
+               if fdDep, err := os.Open(path.Join(redoDir, tgt+DepSuffix)); err == nil {
+                       depInfo, err := depRead(fdDep)
+                       fdDep.Close()
+                       if err == nil && depInfo.build == BuildUUID {
+                               lockRelease()
+                               errs <- nil
+                               return nil
+                       }
+               }
+       }
+
        // Check if target is not modified externally
        modified, inodePrev, hshPrev, err := isModified(cwd, redoDir, tgt)
        if err != nil {