Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
tii_stats - add mutex and atomic ops (clang sanitizer)
  • Loading branch information
perexg committed Mar 10, 2016
1 parent 21ce5d3 commit b028dc9
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 26 deletions.
1 change: 1 addition & 0 deletions src/input.h
Expand Up @@ -101,6 +101,7 @@ struct tvh_input_instance {

LIST_ENTRY(tvh_input_instance) tii_input_link;

pthread_mutex_t tii_stats_mutex;
tvh_input_stream_stats_t tii_stats;

void (*tii_delete) (tvh_input_instance_t *tii);
Expand Down
2 changes: 1 addition & 1 deletion src/input/mpegts/iptv/iptv_udp.c
Expand Up @@ -161,7 +161,7 @@ iptv_rtp_read ( iptv_mux_t *im, udp_multirecv_t *um,

im->mm_iptv_rtp_seq = seq;
if (im->mm_active)
im->mm_active->tii_stats.unc += unc;
atomic_add(&im->mm_active->tii_stats.unc, unc);

return res;
}
Expand Down
19 changes: 14 additions & 5 deletions src/input/mpegts/linuxdvb/linuxdvb_frontend.c
Expand Up @@ -799,6 +799,9 @@ linuxdvb_frontend_monitor ( void *aux )
lfe->lfe_monitor = mclk() + ms2mono(period);
}


pthread_mutex_lock(&mmi->tii_stats_mutex);

/* Statistics - New API */
#if DVB_VER_ATLEAST(5,10)
memset(&fe_properties, 0, sizeof(fe_properties));
Expand Down Expand Up @@ -937,7 +940,8 @@ linuxdvb_frontend_monitor ( void *aux )
gotprop = 0;
if(ioctl_check(lfe, 8) && fe_properties[4].u.st.len > 0) {
if(fe_properties[4].u.st.stat[0].scale == FE_SCALE_COUNTER) {
mmi->tii_stats.unc = mmi->tii_stats.ec_block = fe_properties[4].u.st.stat[0].uvalue;
atomic_set(&mmi->tii_stats.unc, fe_properties[4].u.st.stat[0].uvalue);
mmi->tii_stats.ec_block = fe_properties[4].u.st.stat[0].uvalue;
gotprop = 1;
}
else {
Expand All @@ -957,7 +961,9 @@ linuxdvb_frontend_monitor ( void *aux )
}
else {
ioctl_bad(lfe, 9);
mmi->tii_stats.ec_block = mmi->tii_stats.unc = 0; /* both values or none */
/* both values to none */
mmi->tii_stats.ec_block = 0;
atomic_set(&mmi->tii_stats.unc, 0);
if (logit)
tvhlog(LOG_WARNING, "linuxdvb", "Unhandled TOTAL_BLOCK_COUNT scale: %d",
fe_properties[5].u.st.stat[0].scale);
Expand All @@ -966,7 +972,7 @@ linuxdvb_frontend_monitor ( void *aux )
if(!gotprop && ioctl_check(lfe, 10)) {
/* try old API */
if (!ioctl(lfe->lfe_fe_fd, FE_READ_UNCORRECTED_BLOCKS, &u32)) {
mmi->tii_stats.unc = u32;
atomic_set(&mmi->tii_stats.unc, u32);
gotprop = 1;
}
else {
Expand Down Expand Up @@ -1008,7 +1014,7 @@ linuxdvb_frontend_monitor ( void *aux )
tvhlog(LOG_WARNING, "linuxdvb", "Unable to provide SNR value.");
}
if (ioctl_check(lfe, 4) && !ioctl(lfe->lfe_fe_fd, FE_READ_UNCORRECTED_BLOCKS, &u32))
mmi->tii_stats.unc = u32;
atomic_set(&mmi->tii_stats.unc, u32);
else {
ioctl_bad(lfe, 4);
if (logit)
Expand All @@ -1021,7 +1027,7 @@ linuxdvb_frontend_monitor ( void *aux )
sigstat.snr = mmi->tii_stats.snr;
sigstat.signal = mmi->tii_stats.signal;
sigstat.ber = mmi->tii_stats.ber;
sigstat.unc = mmi->tii_stats.unc;
sigstat.unc = atomic_get(&mmi->tii_stats.unc);
sigstat.signal_scale = mmi->tii_stats.signal_scale;
sigstat.snr_scale = mmi->tii_stats.snr_scale;
sigstat.ec_bit = mmi->tii_stats.ec_bit;
Expand All @@ -1030,6 +1036,9 @@ linuxdvb_frontend_monitor ( void *aux )
sigstat.tc_block = mmi->tii_stats.tc_block;
sm.sm_type = SMT_SIGNAL_STATUS;
sm.sm_data = &sigstat;

pthread_mutex_unlock(&mmi->tii_stats_mutex);

LIST_FOREACH(s, &mmi->mmi_mux->mm_transports, s_active_link) {
pthread_mutex_lock(&s->s_stream_mutex);
streaming_pad_deliver(&s->s_streaming_pad, streaming_msg_clone(&sm));
Expand Down
33 changes: 25 additions & 8 deletions src/input/mpegts/mpegts_input.c
Expand Up @@ -1061,7 +1061,7 @@ mpegts_input_recv_packets
/* Check for sync */
while ( (len >= MIN_TS_SYN) &&
((len2 = ts_sync_count(tsb, len)) < MIN_TS_SYN) ) {
mmi->tii_stats.unc++;
atomic_add(&mmi->tii_stats.unc, 1);
--len;
++tsb;
++off;
Expand Down Expand Up @@ -1295,7 +1295,7 @@ mpegts_input_process
/* Transport error */
if (pid & 0x8000) {
if ((pid & 0x1FFF) != 0x1FFF)
++mmi->tii_stats.te;
atomic_add(&mmi->tii_stats.te, 1);
}

pid &= 0x1FFF;
Expand All @@ -1318,7 +1318,7 @@ mpegts_input_process
cc = tsb2[3] & 0x0f;
if (cc2 != 0xff && cc2 != cc) {
tvhtrace("mpegts", "%s: pid %04X cc err %2d != %2d", muxname, pid, cc, cc2);
++mmi->tii_stats.cc;
atomic_add(&mmi->tii_stats.cc, 1);
}
cc2 = (cc + 1) & 0xF;
}
Expand Down Expand Up @@ -1615,7 +1615,20 @@ mpegts_input_stream_status
st->stream_name = strdup(buf);
st->subs_count = s;
st->max_weight = w;
st->stats = mmi->tii_stats;
pthread_mutex_lock(&mmi->tii_stats_mutex);
st->stats.signal = mmi->tii_stats.signal;
st->stats.snr = mmi->tii_stats.snr;
st->stats.ber = mmi->tii_stats.ber;
st->stats.signal_scale = mmi->tii_stats.signal_scale;
st->stats.snr_scale = mmi->tii_stats.snr_scale;
st->stats.ec_bit = mmi->tii_stats.ec_bit;
st->stats.tc_bit = mmi->tii_stats.tc_bit;
st->stats.ec_block = mmi->tii_stats.ec_block;
st->stats.tc_block = mmi->tii_stats.tc_block;
pthread_mutex_unlock(&mmi->tii_stats_mutex);
st->stats.unc = atomic_get(&mmi->tii_stats.unc);
st->stats.cc = atomic_get(&mmi->tii_stats.cc);
st->stats.te = atomic_get(&mmi->tii_stats.te);
st->stats.bps = atomic_exchange(&mmi->tii_stats.bps, 0) * 8;
}

Expand All @@ -1632,11 +1645,13 @@ mpegts_input_empty_status
st->input_name = strdup(buf);
LIST_FOREACH(mmi_, &mi->mi_mux_instances, tii_input_link) {
mmi = (mpegts_mux_instance_t *)mmi_;
st->stats.unc += mmi->tii_stats.unc;
st->stats.cc += mmi->tii_stats.cc;
st->stats.unc += atomic_get(&mmi->tii_stats.unc);
st->stats.cc += atomic_get(&mmi->tii_stats.cc);
pthread_mutex_lock(&mmi->tii_stats_mutex);
st->stats.te += mmi->tii_stats.te;
st->stats.ec_block += mmi->tii_stats.ec_block;
st->stats.tc_block += mmi->tii_stats.tc_block;
pthread_mutex_unlock(&mmi->tii_stats_mutex);
}
}

Expand Down Expand Up @@ -1672,11 +1687,13 @@ mpegts_input_clear_stats ( tvh_input_t *i )
pthread_mutex_lock(&mi->mi_output_lock);
LIST_FOREACH(mmi_, &mi->mi_mux_instances, tii_input_link) {
mmi = (mpegts_mux_instance_t *)mmi_;
mmi->tii_stats.unc = 0;
mmi->tii_stats.cc = 0;
atomic_set(&mmi->tii_stats.unc, 0);
atomic_set(&mmi->tii_stats.cc, 0);
pthread_mutex_lock(&mmi->tii_stats_mutex);
mmi->tii_stats.te = 0;
mmi->tii_stats.ec_block = 0;
mmi->tii_stats.tc_block = 0;
pthread_mutex_unlock(&mmi->tii_stats_mutex);
}
pthread_mutex_unlock(&mi->mi_output_lock);
notify_reload("input_status");
Expand Down
3 changes: 3 additions & 0 deletions src/input/mpegts/mpegts_mux.c
Expand Up @@ -52,6 +52,7 @@ mpegts_mux_instance_delete
idnode_unlink(&tii->tii_id);
LIST_REMOVE(mmi, mmi_mux_link);
LIST_REMOVE(tii, tii_input_link);
pthread_mutex_destroy(&mmi->tii_stats_mutex);
free(mmi);
}

Expand All @@ -66,6 +67,8 @@ mpegts_mux_instance_create0
return NULL;
}

pthread_mutex_init(&mmi->tii_stats_mutex, NULL);

/* Setup links */
mmi->mmi_mux = mm;
mmi->mmi_input = mi;
Expand Down
27 changes: 16 additions & 11 deletions src/input/mpegts/satip/satip_frontend.c
Expand Up @@ -69,16 +69,18 @@ satip_frontend_signal_cb( void *aux )
lfe->sf_tables = 1;
}
sigstat.status_text = signal2str(lfe->sf_status);
pthread_mutex_lock(&mmi->tii_stats_mutex);
sigstat.snr = mmi->tii_stats.snr;
sigstat.signal = mmi->tii_stats.signal;
sigstat.ber = mmi->tii_stats.ber;
sigstat.unc = mmi->tii_stats.unc;
sigstat.unc = atomic_get(&mmi->tii_stats.unc);
sigstat.signal_scale = mmi->tii_stats.signal_scale;
sigstat.snr_scale = mmi->tii_stats.snr_scale;
sigstat.ec_bit = mmi->tii_stats.ec_bit;
sigstat.tc_bit = mmi->tii_stats.tc_bit;
sigstat.ec_block = mmi->tii_stats.ec_block;
sigstat.tc_block = mmi->tii_stats.tc_block;
pthread_mutex_unlock(&mmi->tii_stats_mutex);
sm.sm_type = SMT_SIGNAL_STATUS;
sm.sm_data = &sigstat;
LIST_FOREACH(svc, &mmi->mmi_mux->mm_transports, s_active_link) {
Expand Down Expand Up @@ -726,6 +728,7 @@ satip_frontend_decode_rtcp( satip_frontend_t *lfe, const char *name,
* -a BER lower than 2x10-4 after Viterbi for DVB-S
* -a PER lower than 10-7 for DVB-S2
*/
pthread_mutex_lock(&mmi->tii_stats_mutex);
while (len >= 12) {
if ((rtcp[0] & 0xc0) != 0x80) /* protocol version: v2 */
return;
Expand All @@ -746,9 +749,9 @@ satip_frontend_decode_rtcp( satip_frontend_t *lfe, const char *name,
strncmp(s, "ver=1.2;tuner=", 14) == 0) {
n = http_tokenize(s + 14, argv, 4, ',');
if (n < 4)
return;
goto fail;
if (atoi(argv[0]) != lfe->sf_number)
return;
goto fail;
mmi->tii_stats.signal =
atoi(argv[1]) * 0xffff / lfe->sf_device->sd_sig_scale;
mmi->tii_stats.signal_scale =
Expand All @@ -767,13 +770,13 @@ satip_frontend_decode_rtcp( satip_frontend_t *lfe, const char *name,
goto ok;
} else if (strncmp(s, "ver=1.0;", 8) == 0) {
if ((s = strstr(s + 8, ";tuner=")) == NULL)
return;
goto fail;
s += 7;
n = http_tokenize(s, argv, 4, ',');
if (n < 4)
return;
goto fail;
if (atoi(argv[0]) != lfe->sf_number)
return;
goto fail;
mmi->tii_stats.signal =
atoi(argv[1]) * 0xffff / lfe->sf_device->sd_sig_scale;
mmi->tii_stats.signal_scale =
Expand All @@ -787,9 +790,9 @@ satip_frontend_decode_rtcp( satip_frontend_t *lfe, const char *name,
} else if (strncmp(s, "ver=1.1;tuner=", 14) == 0) {
n = http_tokenize(s + 14, argv, 4, ',');
if (n < 4)
return;
goto fail;
if (atoi(argv[0]) != lfe->sf_number)
return;
goto fail;
mmi->tii_stats.signal =
atoi(argv[1]) * 0xffff / lfe->sf_device->sd_sig_scale;
mmi->tii_stats.signal_scale =
Expand All @@ -806,14 +809,16 @@ satip_frontend_decode_rtcp( satip_frontend_t *lfe, const char *name,
rtcp += l;
len -= l;
}
return;
goto fail;

ok:
if (mmi->tii_stats.snr < 2 && status == SIGNAL_GOOD)
status = SIGNAL_BAD;
else if (mmi->tii_stats.snr < 4 && status == SIGNAL_GOOD)
status = SIGNAL_FAINT;
lfe->sf_status = status;
fail:
pthread_mutex_unlock(&mmi->tii_stats_mutex);
}

static int
Expand Down Expand Up @@ -1127,7 +1132,7 @@ satip_frontend_rtp_data_received( http_client_t *hc, void *buf, size_t len )
pthread_mutex_lock(&lfe->sf_dvr_lock);
if (lfe->sf_req == lfe->sf_req_thread) {
mmi = lfe->sf_req->sf_mmi;
mmi->tii_stats.unc += unc;
atomic_add(&mmi->tii_stats.unc, unc);
mpegts_input_recv_packets((mpegts_input_t*)lfe, mmi,
&lfe->sf_sbuf, 0, NULL);
}
Expand Down Expand Up @@ -1687,7 +1692,7 @@ satip_frontend_input_thread ( void *aux )
}
pthread_mutex_lock(&lfe->sf_dvr_lock);
if (lfe->sf_req == lfe->sf_req_thread) {
mmi->tii_stats.unc += unc;
atomic_add(&mmi->tii_stats.unc, unc);
mpegts_input_recv_packets((mpegts_input_t*)lfe, mmi, sb, 0, NULL);
} else
fatal = 1;
Expand Down
6 changes: 5 additions & 1 deletion src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c
Expand Up @@ -272,6 +272,8 @@ tvhdhomerun_frontend_monitor_cb( void *aux )
}
}

pthread_mutex_lock(&mmi->tii_stats_mutex);

if(tuner_status.signal_present) {
/* TODO: totaly stupid conversion from 0-100 scale to 0-655.35 */
mmi->tii_stats.snr = tuner_status.signal_to_noise_quality * 655.35;
Expand All @@ -286,10 +288,12 @@ tvhdhomerun_frontend_monitor_cb( void *aux )
sigstat.signal = mmi->tii_stats.signal;
sigstat.signal_scale = mmi->tii_stats.signal_scale = SIGNAL_STATUS_SCALE_RELATIVE;
sigstat.ber = mmi->tii_stats.ber;
sigstat.unc = mmi->tii_stats.unc;
sigstat.unc = atomic_get(&mmi->tii_stats.unc);
sm.sm_type = SMT_SIGNAL_STATUS;
sm.sm_data = &sigstat;

pthread_mutex_unlock(&mmi->tii_stats_mutex);

LIST_FOREACH(svc, &mmi->mmi_mux->mm_transports, s_active_link) {
pthread_mutex_lock(&svc->s_stream_mutex);
streaming_pad_deliver(&svc->s_streaming_pad, streaming_msg_clone(&sm));
Expand Down

0 comments on commit b028dc9

Please sign in to comment.