done channel is now initialized on submit.

add a data() method, to avoid reaching into any xfer fields.
This commit is contained in:
Sebastian Zagrodzki
2017-02-26 21:02:29 +01:00
parent 81e9253f49
commit 00dbfd23dd

View File

@@ -70,13 +70,13 @@ type libusbIntf interface {
release(*libusbDevHandle, uint8)
setAlt(*libusbDevHandle, uint8, uint8) error
// endpoint
// transfer
alloc(*libusbDevHandle, uint8, TransferType, time.Duration, int, []byte) (*libusbTransfer, error)
cancel(*libusbTransfer) error
submit(*libusbTransfer) error
submit(*libusbTransfer, chan struct{}) error
data(*libusbTransfer) (int, TransferStatus)
free(*libusbTransfer)
setIsoPacketLengths(*libusbTransfer, uint32)
compactIsoData(*libusbTransfer) (int, TransferStatus)
}
// libusbImpl is an implementation of libusbIntf using real CGo-wrapped libusb.
@@ -91,7 +91,7 @@ func (libusbImpl) init() (*libusbContext, error) {
}
func (libusbImpl) handleEvents(c *libusbContext, done <-chan struct{}) {
tv := C.struct_timeval{tv_sec: 10}
tv := C.struct_timeval{tv_usec: 100e3}
for {
select {
case <-done:
@@ -346,10 +346,20 @@ func (libusbImpl) cancel(t *libusbTransfer) error {
return fromUSBError(C.libusb_cancel_transfer((*C.struct_libusb_transfer)(t)))
}
func (libusbImpl) submit(t *libusbTransfer) error {
func (libusbImpl) submit(t *libusbTransfer, done chan struct{}) error {
t.user_data = (unsafe.Pointer)(&done)
return fromUSBError(C.submit((*C.struct_libusb_transfer)(t)))
}
func (libusbImpl) data(t *libusbTransfer) (int, TransferStatus) {
if TransferType(t._type) == TRANSFER_TYPE_ISOCHRONOUS {
var status TransferStatus
n := int(C.compact_iso_data((*C.struct_libusb_transfer)(t), (*C.uchar)(unsafe.Pointer(&status))))
return n, status
}
return int(t.actual_length), TransferStatus(t.status)
}
func (libusbImpl) free(t *libusbTransfer) {
C.libusb_free_transfer((*C.struct_libusb_transfer)(t))
}
@@ -358,12 +368,6 @@ func (libusbImpl) setIsoPacketLengths(t *libusbTransfer, length uint32) {
C.libusb_set_iso_packet_lengths((*C.struct_libusb_transfer)(t), C.uint(length))
}
func (libusbImpl) compactIsoData(t *libusbTransfer) (int, TransferStatus) {
var status TransferStatus
n := int(C.compact_iso_data((*C.struct_libusb_transfer)(t), (*C.uchar)(unsafe.Pointer(&status))))
return n, status
}
// libusb is an injection point for tests
var libusb libusbIntf = libusbImpl{}