|
|
@@ -3,6 +3,7 @@ package buf
|
|
|
import (
|
|
|
"io"
|
|
|
"time"
|
|
|
+ "unsafe"
|
|
|
|
|
|
"v2ray.com/core/common/errors"
|
|
|
"v2ray.com/core/common/signal"
|
|
|
@@ -11,6 +12,7 @@ import (
|
|
|
type errorHandler func(error) error
|
|
|
type dataHandler func(MultiBuffer)
|
|
|
|
|
|
+//go:notinheap
|
|
|
type copyHandler struct {
|
|
|
onReadError []errorHandler
|
|
|
onData []dataHandler
|
|
|
@@ -119,10 +121,13 @@ func copyInternal(reader Reader, writer Writer, handler *copyHandler) error {
|
|
|
// Copy dumps all payload from reader to writer or stops when an error occurs. It returns nil when EOF.
|
|
|
func Copy(reader Reader, writer Writer, options ...CopyOption) error {
|
|
|
var handler copyHandler
|
|
|
+ p := uintptr(unsafe.Pointer(&handler))
|
|
|
+ h := (*copyHandler)(unsafe.Pointer(p))
|
|
|
+
|
|
|
for _, option := range options {
|
|
|
- option(&handler)
|
|
|
+ option(h)
|
|
|
}
|
|
|
- err := copyInternal(reader, writer, &handler)
|
|
|
+ err := copyInternal(reader, writer, h)
|
|
|
if err != nil && errors.Cause(err) != io.EOF {
|
|
|
return err
|
|
|
}
|