Codebase list golang-github-gofrs-flock / c644ce9
New upstream release. Debian Janitor 2 years ago
2 changed file(s) with 24 addition(s) and 8 deletion(s). Raw diff Collapse all Expand all
0 golang-github-gofrs-flock (0.8.1-1) UNRELEASED; urgency=low
1
2 * New upstream release.
3
4 -- Debian Janitor <janitor@jelmer.uk> Wed, 16 Mar 2022 06:11:32 -0000
5
06 golang-github-gofrs-flock (0.8.0-1) unstable; urgency=medium
17
28 * Team upload.
3131 const (
3232 readLock lockType = unix.F_RDLCK
3333 writeLock lockType = unix.F_WRLCK
34 )
35
36 type cmdType int
37
38 const (
39 tryLock cmdType = unix.F_SETLK
40 waitLock cmdType = unix.F_SETLKW
3441 )
3542
3643 type inode = uint64
8996 defer f.ensureFhState()
9097 }
9198
92 if _, err := f.doLock(flag, true); err != nil {
99 if _, err := f.doLock(waitLock, flag, true); err != nil {
93100 return err
94101 }
95102
97104 return nil
98105 }
99106
100 func (f *Flock) doLock(lt lockType, blocking bool) (bool, error) {
107 func (f *Flock) doLock(cmd cmdType, lt lockType, blocking bool) (bool, error) {
101108 // POSIX locks apply per inode and process, and the lock for an inode is
102109 // released when *any* descriptor for that inode is closed. So we need to
103110 // synchronize access to each inode internally, and must serialize lock and
142149 wait <- f
143150 }
144151
145 err = setlkw(f.fh.Fd(), lt)
152 err = setlkw(f.fh.Fd(), cmd, lt)
146153
147154 if err != nil {
148155 f.doUnlock()
156 if cmd == tryLock && err == unix.EACCES {
157 return false, nil
158 }
149159 return false, err
150160 }
151161
185195 mu.Unlock()
186196
187197 if owner == f {
188 err = setlkw(f.fh.Fd(), unix.F_UNLCK)
198 err = setlkw(f.fh.Fd(), waitLock, unix.F_UNLCK)
189199 }
190200
191201 mu.Lock()
245255 defer f.ensureFhState()
246256 }
247257
248 haslock, err := f.doLock(flag, false)
258 haslock, err := f.doLock(tryLock, flag, false)
249259 if err != nil {
250260 return false, err
251261 }
254264 return haslock, nil
255265 }
256266
257 // setlkw calls FcntlFlock with F_SETLKW for the entire file indicated by fd.
258 func setlkw(fd uintptr, lt lockType) error {
267 // setlkw calls FcntlFlock with cmd for the entire file indicated by fd.
268 func setlkw(fd uintptr, cmd cmdType, lt lockType) error {
259269 for {
260 err := unix.FcntlFlock(fd, unix.F_SETLKW, &unix.Flock_t{
270 err := unix.FcntlFlock(fd, int(cmd), &unix.Flock_t{
261271 Type: int16(lt),
262272 Whence: io.SeekStart,
263273 Start: 0,