X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fsaleae-logic%2Fsaleae-logic.c;h=7e8c4b10e3ae0316cbccb674b7beb03c4984a54d;hb=ec888f62fe4298229e6ed0865937d74476715bf7;hp=d1b2e11a73bad34df16168b07038c4b53d80af7f;hpb=3e6292b2967db0b86281988ebf816317956a8a51;p=libsigrok.git diff --git a/hardware/saleae-logic/saleae-logic.c b/hardware/saleae-logic/saleae-logic.c index d1b2e11a..7e8c4b10 100644 --- a/hardware/saleae-logic/saleae-logic.c +++ b/hardware/saleae-logic/saleae-logic.c @@ -673,15 +673,25 @@ static int receive_data(int fd, int revents, void *cb_data) } static void abort_acquisition(struct context *ctx) +{ + ctx->num_samples = -1; +} + +static void finish_acquisition(struct context *ctx) { struct sr_datafeed_packet packet; + int i; + /* Terminate session */ packet.type = SR_DF_END; sr_session_send(ctx->session_dev_id, &packet); - ctx->num_samples = -1; - - /* TODO: Need to cancel and free any queued up transfers. */ + /* Remove fds from polling */ + const struct libusb_pollfd **const lupfd = + libusb_get_pollfds(usb_context); + for (i = 0; lupfd[i]; i++) + sr_source_remove(lupfd[i]->fd); + free(lupfd); /* NOT g_free()! */ } static void receive_transfer(struct libusb_transfer *transfer) @@ -701,6 +711,11 @@ static void receive_transfer(struct libusb_transfer *transfer) if (ctx->num_samples == -1) { if (transfer) libusb_free_transfer(transfer); + + ctx->submitted_transfers--; + if (ctx->submitted_transfers == 0) + finish_acquisition(ctx); + return; } @@ -861,6 +876,8 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) g_free(buf); return SR_ERR; } + + ctx->submitted_transfers++; size = 4096; }