From 0ba09a9942105b3830f28b6d59d50e47e70ac482 Mon Sep 17 00:00:00 2001 From: Sebastian Zagrodzki Date: Tue, 14 Feb 2017 01:24:20 +0100 Subject: [PATCH] Move device handle to newUSBTransfer args, remove separate attach() --- usb/endpoint.go | 3 +-- usb/transfer.go | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/usb/endpoint.go b/usb/endpoint.go index 095158d..fd7bb2d 100644 --- a/usb/endpoint.go +++ b/usb/endpoint.go @@ -62,11 +62,10 @@ func (e *endpoint) transfer(buf []byte, timeout time.Duration) (int, error) { } tt := e.TransferType() - t, err := newUSBTransfer(e.EndpointInfo, buf, timeout) + t, err := newUSBTransfer(e.Device.handle, e.EndpointInfo, buf, timeout) if err != nil { return 0, err } - t.attach(e.Device.handle) defer t.free() if err := t.submit(); err != nil { diff --git a/usb/transfer.go b/usb/transfer.go index 104c193..7d81a92 100644 --- a/usb/transfer.go +++ b/usb/transfer.go @@ -35,17 +35,16 @@ func xfer_callback(cptr unsafe.Pointer) { } type usbTransfer struct { + // xfer is the allocated libusb_transfer. xfer *C.struct_libusb_transfer - buf []byte + // buf is the buffer allocated for the transfer. Both buf and xfer.buffer + // point to the same piece of memory. + buf []byte + // done is blocking until the transfer is complete and data and transfer + // status are available. done chan struct{} } -type deviceHandle *C.libusb_device_handle - -func (t *usbTransfer) attach(dev deviceHandle) { - t.xfer.dev_handle = dev -} - func (t *usbTransfer) submit() error { t.done = make(chan struct{}) t.xfer.user_data = (unsafe.Pointer)(&t.done) @@ -80,7 +79,9 @@ func (t *usbTransfer) free() error { return nil } -func newUSBTransfer(ei EndpointInfo, buf []byte, timeout time.Duration) (*usbTransfer, error) { +type deviceHandle *C.libusb_device_handle + +func newUSBTransfer(dev deviceHandle, ei EndpointInfo, buf []byte, timeout time.Duration) (*usbTransfer, error) { var isoPackets int tt := ei.TransferType() if tt == TRANSFER_TYPE_ISOCHRONOUS { @@ -92,6 +93,7 @@ func newUSBTransfer(ei EndpointInfo, buf []byte, timeout time.Duration) (*usbTra return nil, fmt.Errorf("libusb_alloc_transfer(%d) failed", isoPackets) } + xfer.dev_handle = dev xfer.timeout = C.uint(timeout / time.Millisecond) xfer.endpoint = C.uchar(ei.Address) xfer._type = C.uchar(tt)