From 2879abd4f954478ad11b70ea3b2488a03f4d15be Mon Sep 17 00:00:00 2001 From: "Reynaldo H. Verdejo Pinochet" Date: Fri, 24 Oct 2014 20:12:23 -0300 Subject: [PATCH] dvbsrc: rework _output_frontend_stats() Retry stat reporting ioctls on EINTR --- sys/dvb/gstdvbsrc.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c index cb3ab51273..7a19b718e4 100644 --- a/sys/dvb/gstdvbsrc.c +++ b/sys/dvb/gstdvbsrc.c @@ -2054,26 +2054,43 @@ gst_dvbsrc_output_frontend_stats (GstDvbSrc * src) { fe_status_t status; uint16_t snr, _signal; - uint32_t ber, uncorrected_blocks; + uint32_t ber, bad_blks; GstMessage *message; GstStructure *structure; int fe_fd = src->fd_frontend; + gint err; - if (ioctl (fe_fd, FE_READ_STATUS, &status) || - ioctl (fe_fd, FE_READ_SIGNAL_STRENGTH, &_signal) || - ioctl (fe_fd, FE_READ_SNR, &snr) || - ioctl (fe_fd, FE_READ_BER, &ber) || - ioctl (fe_fd, FE_READ_UNCORRECTED_BLOCKS, &uncorrected_blocks)) { - GST_WARNING_OBJECT (src, "Failed to get statistics from the device"); - return; - } + LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_STATUS, &status)); + if (err) + goto error_out; + + LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_SIGNAL_STRENGTH, &_signal)); + if (err) + goto error_out; + + LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_SNR, &snr)); + if (err) + goto error_out; + + LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_BER, &ber)); + if (err) + goto error_out; + + LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_UNCORRECTED_BLOCKS, &bad_blks)); + if (err) + goto error_out; structure = gst_structure_new ("dvb-frontend-stats", "status", G_TYPE_INT, status, "signal", G_TYPE_INT, _signal, "snr", G_TYPE_INT, snr, - "ber", G_TYPE_INT, ber, "unc", G_TYPE_INT, uncorrected_blocks, + "ber", G_TYPE_INT, ber, "unc", G_TYPE_INT, bad_blks, "lock", G_TYPE_BOOLEAN, status & FE_HAS_LOCK, NULL); message = gst_message_new_element (GST_OBJECT (src), structure); gst_element_post_message (GST_ELEMENT (src), message); + return; + +error_out: + GST_WARNING_OBJECT (src, "Failed to get statistics from the device: %s", + g_strerror (errno)); } struct diseqc_cmd