@@ -17,16 +17,9 @@ import (
17
17
type conInputReader struct {
18
18
cancelMixin
19
19
20
- conin windows.Handle
21
- cancelEvent windows.Handle
20
+ conin windows.Handle
22
21
23
22
originalMode uint32
24
-
25
- // inputEvent holds the input event that was read in order to avoid
26
- // unnecessary allocations. This re-use is possible because
27
- // InputRecord.Unwarp which is called inparseInputMsgFromInputRecord
28
- // returns an data structure that is independent of the passed InputRecord.
29
- inputEvent []coninput.InputRecord
30
23
}
31
24
32
25
var _ cancelreader.CancelReader = & conInputReader {}
@@ -53,14 +46,8 @@ func newInputReader(r io.Reader) (cancelreader.CancelReader, error) {
53
46
return nil , fmt .Errorf ("failed to prepare console input: %w" , err )
54
47
}
55
48
56
- cancelEvent , err := windows .CreateEvent (nil , 0 , 0 , nil )
57
- if err != nil {
58
- return nil , fmt .Errorf ("create stop event: %w" , err )
59
- }
60
-
61
49
return & conInputReader {
62
50
conin : conin ,
63
- cancelEvent : cancelEvent ,
64
51
originalMode : originalMode ,
65
52
}, nil
66
53
}
@@ -69,21 +56,11 @@ func newInputReader(r io.Reader) (cancelreader.CancelReader, error) {
69
56
func (r * conInputReader ) Cancel () bool {
70
57
r .setCanceled ()
71
58
72
- err := windows .SetEvent (r .cancelEvent )
73
- if err != nil {
74
- return false
75
- }
76
-
77
- return true
59
+ return windows .CancelIo (r .conin ) == nil
78
60
}
79
61
80
62
// Close implements cancelreader.CancelReader.
81
63
func (r * conInputReader ) Close () error {
82
- err := windows .CloseHandle (r .cancelEvent )
83
- if err != nil {
84
- return fmt .Errorf ("closing cancel event handle: %w" , err )
85
- }
86
-
87
64
if r .originalMode != 0 {
88
65
err := windows .SetConsoleMode (r .conin , r .originalMode )
89
66
if err != nil {
@@ -115,30 +92,6 @@ func prepareConsole(input windows.Handle, modes ...uint32) (originalMode uint32,
115
92
return originalMode , nil
116
93
}
117
94
118
- func waitForInput (conin , cancel windows.Handle ) error {
119
- event , err := windows .WaitForMultipleObjects ([]windows.Handle {conin , cancel }, false , windows .INFINITE )
120
- switch {
121
- case windows .WAIT_OBJECT_0 <= event && event < windows .WAIT_OBJECT_0 + 2 :
122
- if event == windows .WAIT_OBJECT_0 + 1 {
123
- return cancelreader .ErrCanceled
124
- }
125
-
126
- if event == windows .WAIT_OBJECT_0 {
127
- return nil
128
- }
129
-
130
- return fmt .Errorf ("unexpected wait object is ready: %d" , event - windows .WAIT_OBJECT_0 )
131
- case windows .WAIT_ABANDONED <= event && event < windows .WAIT_ABANDONED + 2 :
132
- return fmt .Errorf ("abandoned" )
133
- case event == uint32 (windows .WAIT_TIMEOUT ):
134
- return fmt .Errorf ("timeout" )
135
- case event == windows .WAIT_FAILED :
136
- return fmt .Errorf ("failed" )
137
- default :
138
- return fmt .Errorf ("unexpected error: %w" , err )
139
- }
140
- }
141
-
142
95
// cancelMixin represents a goroutine-safe cancelation status.
143
96
type cancelMixin struct {
144
97
unsafeCanceled bool
0 commit comments