X-Git-Url: http://www.git.cypherpunks.ru/?p=goredo.git;a=blobdiff_plain;f=run.go;h=6366f4a0aad03c79272acf524a0cd8d8972843de;hp=a3740c25a83d9c8e7576e4856b974d76368526c2;hb=f0f007ed9bb046289965d2a7e64f215e4a50a441;hpb=0030b3e73152bf9d9ad3e435fa42e607c7865321 diff --git a/run.go b/run.go index a3740c2..6366f4a 100644 --- a/run.go +++ b/run.go @@ -198,9 +198,14 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { if err != nil { return TgtError{tgtOrig, err} } + flock := unix.Flock_t{ + Type: unix.F_WRLCK, + Whence: io.SeekStart, + } lockRelease := func() { tracef(CLock, "LOCK_UN: %s", fdLock.Name()) - if err := unix.Flock(int(fdLock.Fd()), unix.LOCK_UN); err != nil { + flock.Type = unix.F_UNLCK + if err := unix.FcntlFlock(fdLock.Fd(), unix.F_SETLK, &flock); err != nil { log.Fatalln(err) } fdLock.Close() @@ -208,13 +213,16 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { tracef(CLock, "LOCK_NB: %s", fdLock.Name()) // Waiting for job completion, already taken by someone else - if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_EX|unix.LOCK_NB); err != nil { - if uintptr(err.(syscall.Errno)) != uintptr(unix.EWOULDBLOCK) { + if err = unix.FcntlFlock(fdLock.Fd(), unix.F_SETLK, &flock); err != nil { + if uintptr(err.(syscall.Errno)) != uintptr(unix.EAGAIN) { fdLock.Close() return TgtError{tgtOrig, err} } Jobs.Add(1) - tracef(CDebug, "waiting: %s", tgtOrig) + if err = unix.FcntlFlock(fdLock.Fd(), unix.F_GETLK, &flock); err != nil { + log.Fatalln(err) + } + tracef(CDebug, "waiting: %s (pid=%d)", tgtOrig, flock.Pid) if FdStatus != nil { if _, err = FdStatus.Write([]byte{StatusWait}); err != nil { log.Fatalln(err) @@ -223,7 +231,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { go func() { defer Jobs.Done() tracef(CLock, "LOCK_EX: %s", fdLock.Name()) - if err := unix.Flock(int(fdLock.Fd()), unix.LOCK_EX); err != nil { + if err := unix.FcntlFlock(fdLock.Fd(), unix.F_SETLKW, &flock); err != nil { log.Fatalln(err) } lockRelease()