#include <inttypes.h>
#include <libusb.h>
#include "config.h"
-#include "sigrok.h"
-#include "sigrok-internal.h"
+#include "libsigrok.h"
+#include "libsigrok-internal.h"
#include "fx2lafw.h"
#include "command.h"
static void abort_acquisition(struct context *ctx)
{
+ int i;
+
ctx->num_samples = -1;
+
+ for (i = ctx->num_transfers - 1; i >= 0; i--) {
+ if (ctx->transfers[i])
+ libusb_cancel_transfer(ctx->transfers[i]);
+ }
}
static void finish_acquisition(struct context *ctx)
for (i = 0; lupfd[i]; i++)
sr_source_remove(lupfd[i]->fd);
free(lupfd); /* NOT g_free()! */
+
+ ctx->num_transfers = 0;
+ g_free(ctx->transfers);
}
static void free_transfer(struct libusb_transfer *transfer)
{
struct context *ctx = transfer->user_data;
+ unsigned int i;
g_free(transfer->buffer);
transfer->buffer = NULL;
libusb_free_transfer(transfer);
+ for (i = 0; i < ctx->num_transfers; i++) {
+ if (ctx->transfers[i] == transfer) {
+ ctx->transfers[i] = NULL;
+ break;
+ }
+ }
+
ctx->submitted_transfers--;
if (ctx->submitted_transfers == 0)
finish_acquisition(ctx);
if (ctx->limit_samples &&
(unsigned int)ctx->num_samples > ctx->limit_samples) {
abort_acquisition(ctx);
+ free_transfer(transfer);
+ return;
}
} else {
/*
if (!(sdi = sr_dev_inst_get(dev_insts, dev_index)))
return SR_ERR;
ctx = sdi->priv;
+
+ if (ctx->submitted_transfers != 0)
+ return SR_ERR;
+
ctx->session_dev_id = cb_data;
ctx->num_samples = 0;
ctx->empty_transfer_count = 0;
const unsigned int num_transfers = get_number_of_transfers(ctx);
const size_t size = get_buffer_size(ctx);
+ ctx->transfers = g_try_malloc0(sizeof(*ctx->transfers) * num_transfers);
+ if (!ctx->transfers)
+ return SR_ERR;
+
+ ctx->num_transfers = num_transfers;
+
for (i = 0; i < num_transfers; i++) {
if (!(buf = g_try_malloc(size))) {
sr_err("fx2lafw: %s: buf malloc failed.", __func__);
2 | LIBUSB_ENDPOINT_IN, buf, size,
receive_transfer, ctx, timeout);
if (libusb_submit_transfer(transfer) != 0) {
- /* TODO: Free them all. */
libusb_free_transfer(transfer);
g_free(buf);
+ abort_acquisition(ctx);
return SR_ERR;
}
-
+ ctx->transfers[i] = transfer;
ctx->submitted_transfers++;
}
if ((ret = command_start_acquisition (ctx->usb->devhdl,
ctx->cur_samplerate, ctx->sample_wide)) != SR_OK) {
+ abort_acquisition(ctx);
return ret;
}