Root cause: When a bd daemon crashes, its daemon.lock file remains with the old PID. If that PID gets reused by an unrelated process, the code would wait 5 seconds for a socket that will never appear. Fix: Use flock-based check as authoritative source for daemon liveness. The OS releases flocks when a process dies, so this is immune to PID reuse. Changes: - handleExistingSocket: Check daemon flock before waiting for socket - acquireStartLock: Verify daemon lock is held before waiting - handleStaleLock: Use flock check to detect stale startlocks - lockfile/process_*.go: Add pid <= 0 check to prevent false positives (PID 0 signals process group on Unix, not a specific process) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
29 lines
562 B
Go
29 lines
562 B
Go
//go:build windows
|
|
|
|
package lockfile
|
|
|
|
import (
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
const stillActive = 259
|
|
|
|
// isProcessRunning checks if a process with the given PID is running
|
|
func isProcessRunning(pid int) bool {
|
|
if pid <= 0 {
|
|
return false // Invalid PID
|
|
}
|
|
handle, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, uint32(pid))
|
|
if err != nil {
|
|
return false
|
|
}
|
|
defer windows.CloseHandle(handle)
|
|
|
|
var code uint32
|
|
if err := windows.GetExitCodeProcess(handle, &code); err != nil {
|
|
return false
|
|
}
|
|
|
|
return code == stillActive
|
|
}
|