diff options
author | Marcus Meissner <marcus@jet.franken.de> | 2015-03-29 21:16:36 +0000 |
---|---|---|
committer | Marcus Meissner <marcus@jet.franken.de> | 2015-03-29 21:16:36 +0000 |
commit | c8635e18517dc0f03c90f61c98b4169554cec5eb (patch) | |
tree | bf4506af69ea27a1a0f3d2489f0df915f93d2264 /libgphoto2_port/libusb1 | |
parent | e9d122e4383d9181052c73df1e19eec5c8edfee2 (diff) | |
download | libgphoto2-c8635e18517dc0f03c90f61c98b4169554cec5eb.tar.gz |
cleanup the async interrupt transfers
git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@15412 67ed7778-7388-44ab-90cf-0a291f65f57c
Diffstat (limited to 'libgphoto2_port/libusb1')
-rw-r--r-- | libgphoto2_port/libusb1/libusb1.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/libgphoto2_port/libusb1/libusb1.c b/libgphoto2_port/libusb1/libusb1.c index 0295324f8..a3d6d180e 100644 --- a/libgphoto2_port/libusb1/libusb1.c +++ b/libgphoto2_port/libusb1/libusb1.c @@ -434,6 +434,7 @@ gp_libusb1_open (GPPort *port) static int gp_libusb1_close (GPPort *port) { + int i, haveone; C_PARAMS (port); if (port->pl->dh == NULL) @@ -469,10 +470,24 @@ gp_libusb1_close (GPPort *port) gp_port_set_error (port, _("Could not reattach kernel driver of camera device.")); } - /* This will also cancel the queued transfers */ - libusb_close (port->pl->dh); /* FIXME: free the transfers */ + for (i = 0; i < sizeof(port->pl->transfers)/sizeof(port->pl->transfers[0]); i++) + if (port->pl->transfers[i]) + libusb_cancel_transfer(port->pl->transfers[i]); + haveone = 1; + while (haveone) { + haveone = 0; + for (i = 0; i < sizeof(port->pl->transfers)/sizeof(port->pl->transfers[0]); i++) + if (port->pl->transfers[i]) + haveone = 1; + if (haveone) + if (libusb_handle_events(port->pl->ctx) < 0) + break; + } + + + libusb_close (port->pl->dh); free (port->pl->irqs); free (port->pl->irqlens); @@ -552,10 +567,10 @@ _cb_irq(struct libusb_transfer *transfer) if (transfer->status == LIBUSB_TRANSFER_CANCELLED) { int i; + /* Only requeue the global transfers, not temporary ones */ - for (i = 0; i < sizeof(pl->transfers)/sizeof(pl->transfers); i++) { + for (i = 0; i < sizeof(pl->transfers)/sizeof(pl->transfers[0]); i++) { if (pl->transfers[i] == transfer) { - free(pl->transfers[i]->buffer); libusb_free_transfer (transfer); pl->transfers[i] = NULL; return; @@ -588,10 +603,6 @@ gp_libusb1_queue_interrupt_urbs (GPPort *port) { unsigned int i; - /*return 0;*/ /* not working yet */ - - GP_LOG_D("interrupt is at 0x%02x", port->settings.usb.intep); - for (i = 0; i < sizeof(port->pl->transfers)/sizeof(port->pl->transfers[0]); i++) { unsigned char *buf; port->pl->transfers[i] = libusb_alloc_transfer(0); @@ -600,6 +611,7 @@ gp_libusb1_queue_interrupt_urbs (GPPort *port) libusb_fill_interrupt_transfer(port->pl->transfers[i], port->pl->dh, port->settings.usb.intep, buf, 256, _cb_irq, port->pl, 0 ); + port->pl->transfers[i]->flags |= LIBUSB_TRANSFER_FREE_BUFFER; libusb_submit_transfer (port->pl->transfers[i]); } return GP_OK; |