@node News
@unnumbered News
+@anchor{Release 1_22_0}
+@section Release 1.22.0
+@itemize
+@item
+ @code{flock} locks replaced with POSIX @code{fcntl} ones.
+ They could be more portable.
+@end itemize
+
@anchor{Release 1_21_0}
@section Release 1.21.0
@itemize
if v := os.Getenv(EnvOODTgtsFd); v != "" {
fd := mustParseFd(v, EnvOODTgtsFd)
fdLock := mustParseFd(v, EnvOODTgtsLockFd)
- if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_EX); err != nil {
+ flock := unix.Flock_t{
+ Type: unix.F_WRLCK,
+ Whence: io.SeekStart,
+ }
+ if err = unix.FcntlFlock(fdLock.Fd(), unix.F_SETLKW, &flock); err != nil {
log.Fatalln(err)
}
if _, err = fd.Seek(0, io.SeekStart); err != nil {
if err != nil {
log.Fatalln(err)
}
- 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)
}
OODTgts = map[string]struct{}{}
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 {
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
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)
}
}
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()
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)
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()
)
const (
- Version = "1.21.0"
+ Version = "1.22.0"
Warranty = `Copyright (C) 2020-2022 Sergey Matveev
This program is free software: you can redistribute it and/or modify