From 91f6de4437f13d51a854ffe999cca63ff2ef503c Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sun, 16 Dec 2018 09:19:33 +0100 Subject: [PATCH] dvr: move dvr_notify() call to the global_lock using timers, fixes #5437 --- src/dvr/dvr.h | 1 + src/dvr/dvr_rec.c | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 755b14cfb..1d796058d 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -201,6 +201,7 @@ typedef struct dvr_entry { char *de_channel_name; gtimer_t de_timer; + gtimer_t de_notify_timer; gtimer_t de_watched_timer; mtimer_t de_deferred_timer; diff --git a/src/dvr/dvr_rec.c b/src/dvr/dvr_rec.c index bfa34008c..922ebf57d 100644 --- a/src/dvr/dvr_rec.c +++ b/src/dvr/dvr_rec.c @@ -196,6 +196,8 @@ dvr_rec_unsubscribe(dvr_entry_t *de) pthread_join(de->de_thread, (void **)&postproc); + gtimer_disarm(&de->de_notify_timer); + if (prch->prch_muxer) dvr_thread_epilog(de, postproc); @@ -1178,8 +1180,9 @@ dvr_rec_fatal_error(dvr_entry_t *de, const char *fmt, ...) * */ static void -dvr_notify(dvr_entry_t *de) +dvr_notify(void *aux) { + dvr_entry_t *de = aux; if (de->de_last_notify + sec2mono(5) < mclk()) { idnode_notify_changed(&de->de_id); de->de_last_notify = mclk(); @@ -1711,7 +1714,7 @@ dvr_thread(void *aux) } else { dvr_thread_pkt_stats(de, pkt, 0); } - dvr_notify(de); + gtimer_arm_rel(&de->de_notify_timer, dvr_notify, de, 0); packets++; break; @@ -1759,7 +1762,7 @@ dvr_thread(void *aux) dvr_thread_mpegts_stats(de, sm->sm_data); muxer_write_pkt(prch->prch_muxer, sm->sm_type, sm->sm_data); sm->sm_data = NULL; - dvr_notify(de); + gtimer_arm_rel(&de->de_notify_timer, dvr_notify, de, 0); packets++; break; @@ -1772,14 +1775,14 @@ dvr_thread(void *aux) break; case SMT_STOP: - if (sm->sm_code == SM_CODE_SOURCE_RECONFIGURED) { - // Subscription is restarting, wait for SMT_START - if (muxing) - tvhtrace(LS_DVR, "%s - source reconfigured", idnode_uuid_as_str(&de->de_id, ubuf)); - muxing = 0; // reconfigure muxer + if (sm->sm_code == SM_CODE_SOURCE_RECONFIGURED) { + // Subscription is restarting, wait for SMT_START + if (muxing) + tvhtrace(LS_DVR, "%s - source reconfigured", idnode_uuid_as_str(&de->de_id, ubuf)); + muxing = 0; // reconfigure muxer - } else if(sm->sm_code == 0) { - // Recording is completed + } else if(sm->sm_code == 0) { + // Recording is completed dvr_entry_set_state(de, de->de_sched_state, de->de_rec_state, SM_CODE_OK); tvhinfo(LS_DVR, "Recording completed: \"%s\"", @@ -1799,6 +1802,7 @@ fin: streaming_queue_clear(&backlog); if (!dvr_thread_global_lock(de, &run)) break; + gtimer_disarm(&de->de_notify_timer); dvr_thread_epilog(de, postproc); dvr_thread_global_unlock(de); start_time = 0; -- 2.47.2