Merge pull request #147 from cmaglie/remove_windows_timeout_loop
Remove unnecessary code, originally for checking for disconnects when using non-overlapped I/O
This commit is contained in:
@@ -26,7 +26,6 @@ import (
|
||||
type windowsPort struct {
|
||||
mu sync.Mutex
|
||||
handle syscall.Handle
|
||||
readTimeoutCycles int64
|
||||
}
|
||||
|
||||
func nativeGetPortsList() ([]string, error) {
|
||||
@@ -83,9 +82,7 @@ func (port *windowsPort) Read(p []byte) (int, error) {
|
||||
}
|
||||
defer syscall.CloseHandle(ev.HEvent)
|
||||
|
||||
cycles := int64(0)
|
||||
for {
|
||||
err := syscall.ReadFile(port.handle, p, &readed, ev)
|
||||
err = syscall.ReadFile(port.handle, p, &readed, ev)
|
||||
if err == syscall.ERROR_IO_PENDING {
|
||||
err = getOverlappedResult(port.handle, ev, &readed, true)
|
||||
}
|
||||
@@ -99,34 +96,13 @@ func (port *windowsPort) Read(p []byte) (int, error) {
|
||||
// error happened
|
||||
return int(readed), err
|
||||
}
|
||||
|
||||
if readed > 0 {
|
||||
return int(readed), nil
|
||||
}
|
||||
if err := resetEvent(ev.HEvent); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if port.readTimeoutCycles != -1 {
|
||||
cycles++
|
||||
if cycles == port.readTimeoutCycles {
|
||||
// Timeout
|
||||
return 0, nil
|
||||
}
|
||||
}
|
||||
|
||||
// At the moment it seems that the only reliable way to check if
|
||||
// a serial port is alive in Windows is to check if the SetCommState
|
||||
// function fails.
|
||||
|
||||
params := &dcb{}
|
||||
getCommState(port.handle, params)
|
||||
if err := setCommState(port.handle, params); err != nil {
|
||||
port.Close()
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (port *windowsPort) Write(p []byte) (int, error) {
|
||||
var writed uint32
|
||||
@@ -383,26 +359,24 @@ func (port *windowsPort) GetModemStatusBits() (*ModemStatusBits, error) {
|
||||
}
|
||||
|
||||
func (port *windowsPort) SetReadTimeout(timeout time.Duration) error {
|
||||
var cycles, cycleDuration int64
|
||||
if timeout == NoTimeout {
|
||||
cycles = -1
|
||||
cycleDuration = 1000
|
||||
} else {
|
||||
cycles = timeout.Milliseconds()/1000 + 1
|
||||
cycleDuration = timeout.Milliseconds() / cycles
|
||||
}
|
||||
|
||||
err := setCommTimeouts(port.handle, &commTimeouts{
|
||||
commTimeouts := &commTimeouts{
|
||||
ReadIntervalTimeout: 0xFFFFFFFF,
|
||||
ReadTotalTimeoutMultiplier: 0xFFFFFFFF,
|
||||
ReadTotalTimeoutConstant: uint32(cycleDuration),
|
||||
ReadTotalTimeoutConstant: 0xFFFFFFFE,
|
||||
WriteTotalTimeoutConstant: 0,
|
||||
WriteTotalTimeoutMultiplier: 0,
|
||||
})
|
||||
if err != nil {
|
||||
}
|
||||
if timeout != NoTimeout {
|
||||
ms := timeout.Milliseconds()
|
||||
if ms > 0xFFFFFFFE || ms < 0 {
|
||||
return &PortError{code: InvalidTimeoutValue}
|
||||
}
|
||||
commTimeouts.ReadTotalTimeoutConstant = uint32(ms)
|
||||
}
|
||||
|
||||
if err := setCommTimeouts(port.handle, commTimeouts); err != nil {
|
||||
return &PortError{code: InvalidTimeoutValue, causedBy: err}
|
||||
}
|
||||
port.readTimeoutCycles = cycles
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user