allow for intermediate stage in stopping acquisition
In the case of USB drivers, a driver's dev_acquisition_stop() cannot simply remove its fd sources from the session and close its devices: a USB transfer might still be underway, and it needs to be finished (and its memory freed) properly. An sr_dev_inst->status value is added: SR_ST_STOPPING, which should be set when the driver's dev_acquisition_stop() is called, and acts as a marker for the USB event handler to wind up its operations. In order for dev_acquisition_stop() to be able to set the sdi status, however, it needs to be unconstified.
This commit is contained in:
parent
ac3898d2d0
commit
69b07d14db
|
@ -397,8 +397,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
|
|
||||||
SR_PRIV struct sr_dev_driver asix_sigma_driver_info;
|
SR_PRIV struct sr_dev_driver asix_sigma_driver_info;
|
||||||
static struct sr_dev_driver *adi = &asix_sigma_driver_info;
|
static struct sr_dev_driver *adi = &asix_sigma_driver_info;
|
||||||
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
|
||||||
|
|
||||||
static const uint64_t supported_samplerates[] = {
|
static const uint64_t supported_samplerates[] = {
|
||||||
SR_KHZ(200),
|
SR_KHZ(200),
|
||||||
|
@ -122,9 +123,6 @@ static const char *firmware_files[] = {
|
||||||
"asix-sigma-phasor.fw", /* Frequency counter */
|
"asix-sigma-phasor.fw", /* Frequency counter */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
static int sigma_read(void *buf, size_t size, struct dev_context *devc)
|
static int sigma_read(void *buf, size_t size, struct dev_context *devc)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1419,8 +1417,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
uint8_t modestatus;
|
uint8_t modestatus;
|
||||||
|
|
|
@ -38,8 +38,7 @@ static const uint16_t usb_pids[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Function prototypes. */
|
/* Function prototypes. */
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
static int clear_instances(void)
|
static int clear_instances(void)
|
||||||
{
|
{
|
||||||
|
@ -506,8 +505,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
|
|
||||||
|
|
|
@ -305,8 +305,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
|
|
|
@ -137,8 +137,7 @@ static int default_pattern = PATTERN_SIGROK;
|
||||||
static GThread *my_thread;
|
static GThread *my_thread;
|
||||||
static int thread_running;
|
static int thread_running;
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
static int hw_init(void)
|
static int hw_init(void)
|
||||||
{
|
{
|
||||||
|
@ -512,8 +511,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
|
|
||||||
|
|
|
@ -380,8 +380,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
|
|
|
@ -143,8 +143,7 @@ static struct sr_dev_driver *fdi = &fx2lafw_driver_info;
|
||||||
static int hw_dev_close(struct sr_dev_inst *sdi);
|
static int hw_dev_close(struct sr_dev_inst *sdi);
|
||||||
static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
|
static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
|
||||||
const void *value);
|
const void *value);
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check the USB configuration to determine if this is an fx2lafw device.
|
* Check the USB configuration to determine if this is an fx2lafw device.
|
||||||
|
@ -1027,8 +1026,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
|
/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Avoid compiler warnings. */
|
/* Avoid compiler warnings. */
|
||||||
|
|
|
@ -63,8 +63,7 @@ SR_PRIV struct sr_dev_driver genericdmm_driver_info;
|
||||||
static struct sr_dev_driver *gdi = &genericdmm_driver_info;
|
static struct sr_dev_driver *gdi = &genericdmm_driver_info;
|
||||||
/* TODO need a way to keep this local to the static library */
|
/* TODO need a way to keep this local to the static library */
|
||||||
static libusb_context *genericdmm_usb_context = NULL;
|
static libusb_context *genericdmm_usb_context = NULL;
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
static GSList *connect_serial(const char *conn, const char *serialcomm)
|
static GSList *connect_serial(const char *conn, const char *serialcomm)
|
||||||
{
|
{
|
||||||
|
@ -556,8 +555,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
|
|
||||||
|
|
|
@ -145,8 +145,7 @@ static const char *coupling[] = {
|
||||||
|
|
||||||
SR_PRIV struct sr_dev_driver hantek_dso_driver_info;
|
SR_PRIV struct sr_dev_driver hantek_dso_driver_info;
|
||||||
static struct sr_dev_driver *hdi = &hantek_dso_driver_info;
|
static struct sr_dev_driver *hdi = &hantek_dso_driver_info;
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
static struct sr_dev_inst *dso_dev_new(int index, const struct dso_profile *prof)
|
static struct sr_dev_inst *dso_dev_new(int index, const struct dso_profile *prof)
|
||||||
{
|
{
|
||||||
|
@ -886,8 +885,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
|
|
||||||
|
|
|
@ -1073,8 +1073,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
|
/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
/* Avoid compiler warnings. */
|
/* Avoid compiler warnings. */
|
||||||
(void)cb_data;
|
(void)cb_data;
|
||||||
|
|
|
@ -376,8 +376,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
|
|
|
@ -373,8 +373,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
|
|
|
@ -291,8 +291,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
return SR_OK;
|
return SR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
|
|
||||||
|
|
|
@ -799,8 +799,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
|
/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
|
||||||
static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi,
|
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
struct dev_context *devc;
|
struct dev_context *devc;
|
||||||
|
|
|
@ -547,6 +547,8 @@ enum {
|
||||||
SR_ST_INACTIVE,
|
SR_ST_INACTIVE,
|
||||||
/** The device instance is actively in use in a session. */
|
/** The device instance is actively in use in a session. */
|
||||||
SR_ST_ACTIVE,
|
SR_ST_ACTIVE,
|
||||||
|
/** The device is winding down its session. */
|
||||||
|
SR_ST_STOPPING,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -618,7 +620,7 @@ struct sr_dev_driver {
|
||||||
const void *value);
|
const void *value);
|
||||||
int (*dev_acquisition_start) (const struct sr_dev_inst *sdi,
|
int (*dev_acquisition_start) (const struct sr_dev_inst *sdi,
|
||||||
void *cb_data);
|
void *cb_data);
|
||||||
int (*dev_acquisition_stop) (const struct sr_dev_inst *sdi,
|
int (*dev_acquisition_stop) (struct sr_dev_inst *sdi,
|
||||||
void *cb_data);
|
void *cb_data);
|
||||||
|
|
||||||
/* Dynamic */
|
/* Dynamic */
|
||||||
|
|
Loading…
Reference in New Issue