]> Cypherpunks.ru repositories - goredo.git/blobdiff - ood.go
Use an updated blake3 implementation with AVX-512
[goredo.git] / ood.go
diff --git a/ood.go b/ood.go
index 81f0f7b9fdfbcc66299b76fe12c16bfd54c3ad1a..89307720609fe558d21ebee085f109779ac04172 100644 (file)
--- a/ood.go
+++ b/ood.go
@@ -1,6 +1,6 @@
 /*
 goredo -- djb's redo implementation on pure Go
-Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2020-2022 Sergey Matveev <stargrave@stargrave.org>
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -46,6 +46,8 @@ var (
        OODTgts       map[string]struct{}
        FdOODTgts     *os.File
        FdOODTgtsLock *os.File
+
+       ErrMissingTarget = errors.New("invalid format of .rec: missing Target")
 )
 
 type TgtError struct {
@@ -142,7 +144,7 @@ func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, erro
        for _, m := range depInfo.ifchanges {
                dep := m["Target"]
                if dep == "" {
-                       return ood, TgtError{tgtOrig, errors.New("invalid format of .rec: missing Target")}
+                       return ood, TgtError{tgtOrig, ErrMissingTarget}
                }
                theirInode, err := inodeFromRec(m)
                if err != nil {
@@ -250,7 +252,11 @@ func isOODWithTrace(
                return ood, err
        }
 RecordOODTgt:
-       if err = unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_EX); err != nil {
+       flock := unix.Flock_t{
+               Type:   unix.F_WRLCK,
+               Whence: io.SeekStart,
+       }
+       if err = unix.FcntlFlock(FdOODTgtsLock.Fd(), unix.F_SETLKW, &flock); err != nil {
                log.Fatalln(err)
        }
        if _, err = FdOODTgts.Seek(0, io.SeekEnd); err != nil {
@@ -259,7 +265,8 @@ RecordOODTgt:
        if _, err := FdOODTgts.WriteString(p + "\x00"); err != nil {
                log.Fatalln(err)
        }
-       if err = unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_UN); err != nil {
+       flock.Type = unix.F_UNLCK
+       if err = unix.FcntlFlock(FdOODTgtsLock.Fd(), unix.F_SETLK, &flock); err != nil {
                log.Fatalln(err)
        }
        return true, nil
@@ -267,13 +274,18 @@ RecordOODTgt:
 
 func oodTgtsClear() {
        var err error
-       if err = unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_EX); err != nil {
+       flock := unix.Flock_t{
+               Type:   unix.F_WRLCK,
+               Whence: io.SeekStart,
+       }
+       if err = unix.FcntlFlock(FdOODTgtsLock.Fd(), unix.F_SETLKW, &flock); err != nil {
                log.Fatalln(err)
        }
        if err = FdOODTgts.Truncate(0); err != nil {
                log.Fatalln(err)
        }
-       if err = unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_UN); err != nil {
+       flock.Type = unix.F_UNLCK
+       if err = unix.FcntlFlock(FdOODTgtsLock.Fd(), unix.F_SETLK, &flock); err != nil {
                log.Fatalln(err)
        }
 }