//go:build windows package subagents import ( "errors" "golang.org/x/sys/windows" ) func acquireAgentLease(stateDir string) (*agentLease, error) { file, err := openAgentLeaseFile(stateDir) if err != nil { return nil, err } flags := uint32(windows.LOCKFILE_EXCLUSIVE_LOCK | windows.LOCKFILE_FAIL_IMMEDIATELY) var overlapped windows.Overlapped if err := windows.LockFileEx(windows.Handle(file.Fd()), flags, 0, 1, 0, &overlapped); err != nil { _ = file.Close() if errors.Is(err, windows.ERROR_LOCK_VIOLATION) { return nil, ErrAgentLeaseHeld } return nil, err } return &agentLease{file: file}, nil } func (l *agentLease) Close() error { if l == nil || l.file == nil { return nil } var overlapped windows.Overlapped unlockErr := windows.UnlockFileEx(windows.Handle(l.file.Fd()), 0, 1, 0, &overlapped) closeErr := l.file.Close() l.file = nil if unlockErr != nil { return unlockErr } return closeErr }