返回 DeepSeek-Reasonix
lock_unix.go
根目录 / internal / workspacelease / lock_unix.go
1 //go:build !windows
2
3 package workspacelease
4
5 import (
6 "errors"
7 "os"
8
9 "golang.org/x/sys/unix"
10 )
11
12 func tryLockFile(path string) (func(), error) {
13 f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0o600)
14 if err != nil {
15 return nil, err
16 }
17 if err := unix.Flock(int(f.Fd()), unix.LOCK_EX|unix.LOCK_NB); err != nil {
18 _ = f.Close()
19 if errors.Is(err, unix.EWOULDBLOCK) || errors.Is(err, unix.EAGAIN) {
20 return nil, errHeld
21 }
22 return nil, err
23 }
24 return func() {
25 _ = unix.Flock(int(f.Fd()), unix.LOCK_UN)
26 _ = f.Close()
27 }, nil
28 }
29
29 lines GO