limit log: move it to tvhlog.h, use a condition instead a print function
This commit is contained in:
parent
a82cdec82d
commit
8677a62f78
12 changed files with 41 additions and 67 deletions
|
@ -71,7 +71,7 @@ typedef struct th_descrambler_runtime {
|
|||
time_t dr_ecm_key_time;
|
||||
time_t dr_last_err;
|
||||
sbuf_t dr_buf;
|
||||
loglimiter_t dr_loglimit_key;
|
||||
tvhlog_limit_t dr_loglimit_key;
|
||||
} th_descrambler_runtime_t;
|
||||
|
||||
typedef void (*descrambler_section_callback_t)
|
||||
|
|
|
@ -359,7 +359,8 @@ descrambler_descramble ( service_t *t,
|
|||
ki = tsb[3];
|
||||
if ((ki & 0x80) != 0x00) {
|
||||
if (key_valid(dr, ki) == 0) {
|
||||
limitedlog(&dr->dr_loglimit_key, "descrambler",
|
||||
if (tvhlog_limit(&dr->dr_loglimit_key, 10))
|
||||
tvhwarn("descrambler", "%s %s",
|
||||
((mpegts_service_t *)t)->s_dvb_svcname,
|
||||
(ki & 0x40) ? "odd stream key is not valid" :
|
||||
"even stream key is not valid");
|
||||
|
|
|
@ -197,8 +197,7 @@ struct mpegts_table
|
|||
|
||||
int8_t mt_cc;
|
||||
|
||||
time_t mt_last_perr; // last printer error
|
||||
size_t mt_errors; // total number of table errors
|
||||
tvhlog_limit_t mt_err_log;
|
||||
|
||||
mpegts_psi_section_t mt_sect;
|
||||
|
||||
|
|
|
@ -62,13 +62,10 @@ mpegts_table_dispatch
|
|||
|
||||
if (tid == 0x72) { /* stuffing section */
|
||||
if (len != r - 3) {
|
||||
mt->mt_errors++;
|
||||
if (mt->mt_last_perr + 10 < dispatch_clock) {
|
||||
if (tvhlog_limit(&mt->mt_err_log, 10))
|
||||
tvhwarn(mt->mt_name, "stuffing found with trailing data "
|
||||
"(len %i, total %zi, errors %zi)",
|
||||
len, r, mt->mt_errors);
|
||||
mt->mt_last_perr = dispatch_clock;
|
||||
}
|
||||
len, r, mt->mt_err_log.count);
|
||||
}
|
||||
dvb_table_reset(mt);
|
||||
return;
|
||||
|
@ -77,12 +74,9 @@ mpegts_table_dispatch
|
|||
/* It seems some hardware (or is it the dvb API?) does not
|
||||
honour the DMX_CHECK_CRC flag, so we check it again */
|
||||
if(chkcrc && tvh_crc32(sec, r, 0xffffffff)) {
|
||||
mt->mt_errors++;
|
||||
if (mt->mt_last_perr + 10 < dispatch_clock) {
|
||||
if (tvhlog_limit(&mt->mt_err_log, 10))
|
||||
tvhwarn(mt->mt_name, "invalid checksum (len %zi, errors %zi)",
|
||||
r, mt->mt_errors);
|
||||
mt->mt_last_perr = dispatch_clock;
|
||||
}
|
||||
r, mt->mt_err_log.count);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -69,11 +69,11 @@ ts_recv_packet0
|
|||
if(tsb[3] & 0x10) {
|
||||
cc = tsb[3] & 0xf;
|
||||
if(st->es_cc != -1 && cc != st->es_cc) {
|
||||
/* Let the hardware to stabilize */
|
||||
if (t->s_start_time + 1 < dispatch_clock)
|
||||
/* Incorrect CC */
|
||||
limitedlog(&st->es_loglimit_cc, "TS", service_component_nicename(st),
|
||||
"Continuity counter error");
|
||||
/* Let the hardware to stabilize and don't flood the log */
|
||||
if (t->s_start_time + 1 < dispatch_clock &&
|
||||
tvhlog_limit(&st->es_cc_log, 10))
|
||||
tvhwarn("TS", "%s Continuity counter error (total %zi)",
|
||||
service_component_nicename(st), st->es_cc_log.count);
|
||||
avgstat_add(&t->s_cc_errors, 1, dispatch_clock);
|
||||
avgstat_add(&st->es_cc_errors, 1, dispatch_clock);
|
||||
|
||||
|
@ -192,8 +192,9 @@ ts_recv_packet1
|
|||
|
||||
if(error) {
|
||||
/* Transport Error Indicator */
|
||||
limitedlog(&t->s_loglimit_tei, "TS", service_nicename((service_t*)t),
|
||||
"Transport error indicator");
|
||||
if (tvhlog_limit(&t->s_tei_log, 10))
|
||||
tvhwarn("TS", "%s Transport error indicator (total %zi)",
|
||||
service_nicename((service_t*)t), t->s_tei_log.count);
|
||||
}
|
||||
|
||||
pid = (tsb[1] & 0x1f) << 8 | tsb[2];
|
||||
|
|
26
src/main.c
26
src/main.c
|
@ -164,7 +164,6 @@ const tvh_caps_t tvheadend_capabilities[] = {
|
|||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
time_t dispatch_clock;
|
||||
pthread_mutex_t global_lock;
|
||||
pthread_mutex_t ffmpeg_lock;
|
||||
pthread_mutex_t fork_lock;
|
||||
|
@ -986,31 +985,6 @@ scopedunlock(pthread_mutex_t **mtxp)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
limitedlog(loglimiter_t *ll, const char *sys, const char *o, const char *event)
|
||||
{
|
||||
time_t now;
|
||||
char buf[64];
|
||||
time(&now);
|
||||
|
||||
ll->events++;
|
||||
if(ll->last == now)
|
||||
return; // Duplicate event
|
||||
|
||||
if(ll->last <= now - 10) {
|
||||
// Too old, reset duplicate counter
|
||||
ll->events = 0;
|
||||
buf[0] = 0;
|
||||
} else {
|
||||
snprintf(buf, sizeof(buf), ", %d duplicate log lines suppressed",
|
||||
ll->events);
|
||||
}
|
||||
|
||||
tvhlog(LOG_WARNING, sys, "%s: %s%s", o, event, buf);
|
||||
ll->last = now;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -851,8 +851,9 @@ parse_pes_header(service_t *t, elementary_stream_t *st,
|
|||
err:
|
||||
st->es_curdts = PTS_UNSET;
|
||||
st->es_curpts = PTS_UNSET;
|
||||
limitedlog(&st->es_loglimit_pes, "TS", service_component_nicename(st),
|
||||
"Corrupted PES header");
|
||||
if (tvhlog_limit(&st->es_pes_log, 10))
|
||||
tvhwarn("TS", "%s Corrupted PES header (errors %zi)",
|
||||
service_component_nicename(st), st->es_pes_log.count);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -259,6 +259,9 @@ stream_clean(elementary_stream_t *st)
|
|||
|
||||
free(st->es_section);
|
||||
st->es_section = NULL;
|
||||
|
||||
tvhlog_limit_reset(&st->es_cc_log);
|
||||
tvhlog_limit_reset(&st->es_pes_log);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -320,6 +323,7 @@ service_stop(service_t *t)
|
|||
stream_clean(st);
|
||||
|
||||
t->s_status = SERVICE_IDLE;
|
||||
tvhlog_limit_reset(&t->s_tei_log);
|
||||
|
||||
pthread_mutex_unlock(&t->s_stream_mutex);
|
||||
}
|
||||
|
|
|
@ -115,8 +115,8 @@ typedef struct elementary_stream {
|
|||
|
||||
/* Error log limiters */
|
||||
|
||||
loglimiter_t es_loglimit_cc;
|
||||
loglimiter_t es_loglimit_pes;
|
||||
tvhlog_limit_t es_cc_log;
|
||||
tvhlog_limit_t es_pes_log;
|
||||
|
||||
char *es_nicename;
|
||||
|
||||
|
@ -434,9 +434,7 @@ typedef struct service {
|
|||
*/
|
||||
streaming_pad_t s_streaming_pad;
|
||||
|
||||
|
||||
loglimiter_t s_loglimit_tei;
|
||||
|
||||
tvhlog_limit_t s_tei_log;
|
||||
|
||||
int64_t s_current_pts;
|
||||
|
||||
|
|
|
@ -195,18 +195,6 @@ LIST_HEAD(dvr_autorec_entry_list, dvr_autorec_entry);
|
|||
TAILQ_HEAD(th_pktref_queue, th_pktref);
|
||||
LIST_HEAD(streaming_target_list, streaming_target);
|
||||
|
||||
/**
|
||||
* Log limiter
|
||||
*/
|
||||
typedef struct loglimter {
|
||||
time_t last;
|
||||
int events;
|
||||
} loglimiter_t;
|
||||
|
||||
void limitedlog(loglimiter_t *ll, const char *sys,
|
||||
const char *o, const char *event);
|
||||
|
||||
|
||||
/**
|
||||
* Device connection types
|
||||
*/
|
||||
|
@ -572,7 +560,6 @@ int sri_to_rate(int sri);
|
|||
int rate_to_sri(int rate);
|
||||
|
||||
|
||||
extern time_t dispatch_clock;
|
||||
extern struct service_list all_transports;
|
||||
|
||||
extern void scopedunlock(pthread_mutex_t **mtxp);
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
|
||||
#include "webui/webui.h"
|
||||
|
||||
time_t dispatch_clock;
|
||||
|
||||
int tvhlog_run;
|
||||
int tvhlog_level;
|
||||
int tvhlog_options;
|
||||
|
|
13
src/tvhlog.h
13
src/tvhlog.h
|
@ -30,6 +30,14 @@
|
|||
|
||||
#include "htsmsg.h"
|
||||
|
||||
typedef struct {
|
||||
time_t last;
|
||||
size_t count;
|
||||
} tvhlog_limit_t;
|
||||
|
||||
/* Globals */
|
||||
extern time_t dispatch_clock;
|
||||
|
||||
/* Config */
|
||||
extern int tvhlog_level;
|
||||
extern htsmsg_t *tvhlog_debug;
|
||||
|
@ -57,6 +65,11 @@ void _tvhlog_hexdump ( const char *file, int line,
|
|||
int notify, int severity,
|
||||
const char *subsys,
|
||||
const uint8_t *data, ssize_t len );
|
||||
static inline void tvhlog_limit_reset ( tvhlog_limit_t *limit )
|
||||
{ limit->last = 0; limit->count = 0; }
|
||||
static inline int tvhlog_limit ( tvhlog_limit_t *limit, uint32_t delay )
|
||||
{ time_t t = dispatch_clock; int res = limit->last + delay < t;
|
||||
limit->count++; limit->last = t; return res; }
|
||||
|
||||
|
||||
/* Options */
|
||||
|
|
Loading…
Add table
Reference in a new issue