1
2
3
4
5
6
7 package filelock
8
9 import (
10 "io/fs"
11 "syscall"
12 )
13
14 type lockType int16
15
16 const (
17 readLock lockType = syscall.LOCK_SH
18 writeLock lockType = syscall.LOCK_EX
19 )
20
21 func lock(f File, lt lockType) (err error) {
22 for {
23 err = syscall.Flock(int(f.Fd()), int(lt))
24 if err != syscall.EINTR {
25 break
26 }
27 }
28 if err != nil {
29 return &fs.PathError{
30 Op: lt.String(),
31 Path: f.Name(),
32 Err: err,
33 }
34 }
35 return nil
36 }
37
38 func unlock(f File) error {
39 return lock(f, syscall.LOCK_UN)
40 }
41
View as plain text