//go:build windows // +build windows package fqueue import ( "syscall" "unsafe" ) var ( modkernel32 = syscall.NewLazyDLL("kernel32.dll") procLockFileEx = modkernel32.NewProc("LockFileEx") procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") ) func lock(fd int, wait bool) error { handle := syscall.Handle(fd) var flags uint32 = 0x00000002 // LOCKFILE_EXCLUSIVE_LOCK if !wait { flags |= 0x00000001 // LOCKFILE_FAIL_IMMEDIATELY } var overlapped syscall.Overlapped r, _, err := procLockFileEx.Call( uintptr(handle), uintptr(flags), 0, uintptr(^uint32(0)), // максимальное количество байт uintptr(^uint32(0)), uintptr(unsafe.Pointer(&overlapped)), ) if r == 0 { return err } return nil } func unlock(fd int) error { handle := syscall.Handle(fd) var overlapped syscall.Overlapped r, _, err := procUnlockFileEx.Call( uintptr(handle), 0, uintptr(^uint32(0)), uintptr(^uint32(0)), uintptr(unsafe.Pointer(&overlapped)), ) if r == 0 { return err } return nil }