@@ -115,12 +115,7 @@ func Copy(reader Reader, writer Writer, options ...CopyOption) error {
115115 for _ , option := range options {
116116 option (& handler )
117117 }
118- var err error
119- if sReader , ok := reader .(* SingleReader ); ok && false {
120- err = copyV (sReader , writer , & handler )
121- } else {
122- err = copyInternal (reader , writer , & handler )
123- }
118+ err := copyInternal (reader , writer , & handler )
124119 if err != nil && errors .Cause (err ) != io .EOF {
125120 return err
126121 }
@@ -141,7 +136,29 @@ func CopyOnceTimeout(reader Reader, writer Writer, timeout time.Duration) error
141136 return writer .WriteMultiBuffer (mb )
142137}
143138
144- func copyV (r * SingleReader , w Writer , handler * copyHandler ) error {
139+ func TryCopyV (reader Reader , writer Writer , options ... CopyOption ) error {
140+ var doCopyV bool
141+ if _ , ok := reader .(TimeoutReader ); ok {
142+ doCopyV = true
143+ }
144+ if _ , ok := reader .(* SingleReader ); ! ok {
145+ doCopyV = true
146+ }
147+ if ! doCopyV {
148+ return Copy (reader , writer , options ... )
149+ }
150+ var handler copyHandler
151+ for _ , option := range options {
152+ option (& handler )
153+ }
154+ err := copyVInternal (reader , writer , & handler )
155+ if err != nil && errors .Cause (err ) != io .EOF {
156+ return err
157+ }
158+ return nil
159+ }
160+
161+ func copyVInternal (r Reader , w Writer , handler * copyHandler ) error {
145162 // channel buffer size is maxBuffer/maxPerPacketLen (ignore the case of many small packets)
146163 // default buffer size:
147164 // 0 in ARM MIPS MIPSLE
@@ -162,23 +179,25 @@ func copyV(r *SingleReader, w Writer, handler *copyHandler) error {
162179 defer wg .Done ()
163180 defer close (cache )
164181 for {
165- b , err := r .readBuffer ()
166- if err == nil {
167- select {
168- case cache <- b :
169- // must be write error
170- case <- stopRead :
171- b .Release ()
182+ mb , err := r .ReadMultiBuffer ()
183+ for _ , b := range mb {
184+ if err == nil {
185+ select {
186+ case cache <- b :
187+ // must be write error
188+ case <- stopRead :
189+ b .Release ()
190+ return
191+ }
192+ } else {
193+ rErr = err
194+ select {
195+ case cache <- b :
196+ case <- stopRead :
197+ b .Release ()
198+ }
172199 return
173200 }
174- } else {
175- rErr = err
176- select {
177- case cache <- b :
178- case <- stopRead :
179- b .Release ()
180- }
181- return
182201 }
183202 }
184203 }()
0 commit comments