diff --git a/src/ftdi.c b/src/ftdi.c
index fdf93fe..febab15 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -1613,6 +1613,7 @@ struct ftdi_transfer_control *ftdi_write_data_submit(struct ftdi_context *ftdi,
tc->ftdi = ftdi;
tc->completed = 0;
+ tc->sigblock = 1;
tc->buf = buf;
tc->size = size;
tc->offset = 0;
@@ -1669,6 +1670,7 @@ struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context *ftdi, u
tc->ftdi = ftdi;
tc->buf = buf;
tc->size = size;
+ tc->sigblock = 1;
if (size <= (int)ftdi->readbuffer_remaining)
{
@@ -1722,6 +1724,24 @@ struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context *ftdi, u
}
/**
+ Sets the signal block flag for given transfer control structure.
+ This flag allows to block signals during ftdi_transfer_data_done() execution.
+
+ \param tc Pointer to transfer control structure
+ \param flag Value of sigblock flag to set:
+ \li 0 ftdi_transfer_data_done() could be interrupted by signals
+ \li != 0 ftdi_transfer_data_done() will not honour signals
+*/
+
+void ftdi_transfer_set_sigblock(struct ftdi_transfer_control *tc, int flag)
+{
+ if (tc)
+ tc->sigblock = flag;
+
+ return;
+}
+
+/**
Wait for completion of the transfer.
Use libusb 1.0 asynchronous API.
@@ -1730,6 +1750,12 @@ struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context *ftdi, u
\retval < 0: Some error happens
\retval >= 0: Data size transferred
+
+ \remark
+ This function could be interrupted by signals
+ if sigblock field in tc structure was set to 0.
+ Default behaviour: signals are blocked.
+ See ftdi_transfer_set_sigblock()
*/
int ftdi_transfer_data_done(struct ftdi_transfer_control *tc)
@@ -1742,7 +1768,7 @@ int ftdi_transfer_data_done(struct ftdi_transfer_control *tc)
&to, &tc->completed);
if (ret < 0)
{
- if (ret == LIBUSB_ERROR_INTERRUPTED)
+ if ((tc->sigblock) && (ret == LIBUSB_ERROR_INTERRUPTED))
continue;
libusb_cancel_transfer(tc->transfer);
while (!tc->completed)
@@ -1756,10 +1782,10 @@ int ftdi_transfer_data_done(struct ftdi_transfer_control *tc)
}
ret = tc->offset;
- /**
+ /*
* tc->transfer could be NULL if "(size <= ftdi->readbuffer_remaining)"
* at ftdi_read_data_submit(). Therefore, we need to check it here.
- **/
+ */
if (tc->transfer)
{
if (tc->transfer->status != LIBUSB_TRANSFER_COMPLETED)
diff --git a/src/ftdi.h b/src/ftdi.h
index ca38bbe..005b852 100644
--- a/src/ftdi.h
+++ b/src/ftdi.h
@@ -204,6 +204,7 @@ enum ftdi_module_detach_mode
struct ftdi_transfer_control
{
int completed;
+ int sigblock;
unsigned char *buf;
int size;
int offset;
@@ -524,6 +525,7 @@ extern "C"
struct ftdi_transfer_control *ftdi_write_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size);
struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size);
+ void ftdi_transfer_set_sigblock(struct ftdi_transfer_control *tc, int flag);
int ftdi_transfer_data_done(struct ftdi_transfer_control *tc);
void ftdi_transfer_data_cancel(struct ftdi_transfer_control *tc, struct timeval * to);