summaryrefslogtreecommitdiff
path: root/libgphoto2_port/libusb1
diff options
context:
space:
mode:
authorMarcus Meissner <marcus@jet.franken.de>2015-03-29 21:16:36 +0000
committerMarcus Meissner <marcus@jet.franken.de>2015-03-29 21:16:36 +0000
commitc8635e18517dc0f03c90f61c98b4169554cec5eb (patch)
treebf4506af69ea27a1a0f3d2489f0df915f93d2264 /libgphoto2_port/libusb1
parente9d122e4383d9181052c73df1e19eec5c8edfee2 (diff)
downloadlibgphoto2-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.c28
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;