返回 DeepSeek-Reasonix
lock_windows.go
根目录 / internal / workspacelease / lock_windows.go
1 //go:build windows
2
3 package workspacelease
4
5 import (
6 "errors"
7 "os"
8
9 "golang.org/x/sys/windows"
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 if errors.Is(err, windows.ERROR_SHARING_VIOLATION) {
16 return nil, errHeld
17 }
18 return nil, err
19 }
20 handle := windows.Handle(f.Fd())
21 var overlapped windows.Overlapped
22 flags := uint32(windows.LOCKFILE_EXCLUSIVE_LOCK | windows.LOCKFILE_FAIL_IMMEDIATELY)
23 if err := windows.LockFileEx(handle, flags, 0, 1, 0, &overlapped); err != nil {
24 _ = f.Close()
25 if errors.Is(err, windows.ERROR_LOCK_VIOLATION) || errors.Is(err, windows.ERROR_SHARING_VIOLATION) {
26 return nil, errHeld
27 }
28 return nil, err
29 }
30 return func() {
31 _ = windows.UnlockFileEx(handle, 0, 1, 0, &overlapped)
32 _ = f.Close()
33 }, nil
34 }
35
35 lines GO