@@ -28,8 +28,9 @@ import (
28
28
)
29
29
30
30
type windowsPort struct {
31
- mu sync.Mutex
32
- handle windows.Handle
31
+ mu sync.Mutex
32
+ handle windows.Handle
33
+ hasTimeout bool
33
34
}
34
35
35
36
func nativeGetPortsList () ([]string , error ) {
@@ -72,26 +73,33 @@ func (port *windowsPort) Read(p []byte) (int, error) {
72
73
}
73
74
defer windows .CloseHandle (ev .HEvent )
74
75
75
- err = windows .ReadFile (port .handle , p , & readed , ev )
76
- if err == windows .ERROR_IO_PENDING {
77
- err = windows .GetOverlappedResult (port .handle , ev , & readed , true )
78
- }
79
- switch err {
80
- case nil :
81
- // operation completed successfully
82
- case windows .ERROR_OPERATION_ABORTED :
83
- // port may have been closed
84
- return int (readed ), & PortError {code : PortClosed , causedBy : err }
85
- default :
86
- // error happened
87
- return int (readed ), err
88
- }
89
- if readed > 0 {
90
- return int (readed ), nil
91
- }
76
+ for {
77
+ err = windows .ReadFile (port .handle , p , & readed , ev )
78
+ if err == windows .ERROR_IO_PENDING {
79
+ err = windows .GetOverlappedResult (port .handle , ev , & readed , true )
80
+ }
81
+ switch err {
82
+ case nil :
83
+ // operation completed successfully
84
+ case windows .ERROR_OPERATION_ABORTED :
85
+ // port may have been closed
86
+ return int (readed ), & PortError {code : PortClosed , causedBy : err }
87
+ default :
88
+ // error happened
89
+ return int (readed ), err
90
+ }
91
+ if readed > 0 {
92
+ return int (readed ), nil
93
+ }
92
94
93
- // Timeout
94
- return 0 , nil
95
+ // Timeout
96
+ port .mu .Lock ()
97
+ hasTimeout := port .hasTimeout
98
+ port .mu .Unlock ()
99
+ if hasTimeout {
100
+ return 0 , nil
101
+ }
102
+ }
95
103
}
96
104
97
105
func (port * windowsPort ) Write (p []byte ) (int , error ) {
@@ -304,9 +312,12 @@ func (port *windowsPort) SetReadTimeout(timeout time.Duration) error {
304
312
commTimeouts .ReadTotalTimeoutConstant = uint32 (ms )
305
313
}
306
314
315
+ port .mu .Lock ()
316
+ defer port .mu .Unlock ()
307
317
if err := windows .SetCommTimeouts (port .handle , commTimeouts ); err != nil {
308
318
return & PortError {code : InvalidTimeoutValue , causedBy : err }
309
319
}
320
+ port .hasTimeout = (timeout != NoTimeout )
310
321
311
322
return nil
312
323
}
0 commit comments