From: Joel Holdsworth Date: Sat, 24 Mar 2012 10:04:36 +0000 (+0000) Subject: fx2lafw: Only terminate session after all transfers have been aborted X-Git-Tag: libsigrok-0.1.0~28 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=cb61e9f7c3cfa2e3c9eee0bd221f47dd95f34073;p=libsigrok.git fx2lafw: Only terminate session after all transfers have been aborted --- diff --git a/hardware/fx2lafw/fx2lafw.c b/hardware/fx2lafw/fx2lafw.c index ffc89c4e..7f0c6734 100644 --- a/hardware/fx2lafw/fx2lafw.c +++ b/hardware/fx2lafw/fx2lafw.c @@ -573,15 +573,25 @@ static int receive_data(int fd, int revents, void *cb_data) } static void abort_acquisition(struct context *ctx) +{ + ctx->num_samples = -1; +} + +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) @@ -601,6 +611,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; } @@ -761,6 +776,8 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) g_free(buf); return SR_ERR; } + + ctx->submitted_transfers++; size = 4096; } diff --git a/hardware/fx2lafw/fx2lafw.h b/hardware/fx2lafw/fx2lafw.h index 310a55d2..48b6c441 100644 --- a/hardware/fx2lafw/fx2lafw.h +++ b/hardware/fx2lafw/fx2lafw.h @@ -66,6 +66,7 @@ struct context { uint8_t trigger_buffer[NUM_TRIGGER_STAGES]; int num_samples; + int submitted_transfers; void *session_dev_id;