X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=ood.go;h=39c265cf787ef253bfdb6193d0bd3e9dcd094557;hb=f0f007ed9bb046289965d2a7e64f215e4a50a441;hp=81f0f7b9fdfbcc66299b76fe12c16bfd54c3ad1a;hpb=2cea0c64b5a0240bfe6746a98a5b350812edb96d;p=goredo.git diff --git a/ood.go b/ood.go index 81f0f7b..39c265c 100644 --- a/ood.go +++ b/ood.go @@ -1,6 +1,6 @@ /* goredo -- djb's redo implementation on pure Go -Copyright (C) 2020-2021 Sergey Matveev +Copyright (C) 2020-2022 Sergey Matveev 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 @@ -250,7 +250,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 +263,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 +272,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) } }