From a4eeb8b0c520fbdbb1897ab46c7ed5de0d4111a3 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sun, 9 Apr 2017 21:26:34 +0200 Subject: [PATCH] DVR: try to fix crashes caused by the idnode changedfn call --- src/dvr/dvr.h | 1 + src/dvr/dvr_db.c | 7 +++++++ src/dvr/dvr_rec.c | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index f2504118b..d4880b880 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -159,6 +159,7 @@ typedef struct dvr_entry { idnode_t de_id; int de_refcnt; /* Modification is protected under global_lock */ + int de_in_unsubscribe; /** diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 61a920f86..f64dfc61f 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -757,6 +757,11 @@ dvr_entry_set_timer(dvr_entry_t *de) } } + if (de->de_sched_state == DVR_RECORDING) { + dvr_stop_recording(de, de->de_last_error, 1, 0); + return; + } + /* Files are missing and job was completed */ if(htsmsg_is_empty(de->de_files) && !de->de_dont_reschedule) dvr_entry_missed_time(de, de->de_last_error); @@ -2227,6 +2232,8 @@ static void dvr_entry_class_changed(idnode_t *self) { dvr_entry_t *de = (dvr_entry_t *)self; + if (de->de_in_unsubscribe) + return; if (dvr_entry_is_valid(de)) dvr_entry_set_timer(de); htsp_dvr_entry_update(de); diff --git a/src/dvr/dvr_rec.c b/src/dvr/dvr_rec.c index 7edd9932d..0370325ff 100644 --- a/src/dvr/dvr_rec.c +++ b/src/dvr/dvr_rec.c @@ -160,6 +160,8 @@ dvr_rec_unsubscribe(dvr_entry_t *de) assert(de->de_s != NULL); assert(prch != NULL); + de->de_in_unsubscribe = 1; + streaming_target_deliver(prch->prch_st, streaming_msg_create(SMT_EXIT)); atomic_add(&de->de_thread_shutdown, 1); @@ -179,6 +181,8 @@ dvr_rec_unsubscribe(dvr_entry_t *de) free(prch); dvr_vfs_refresh_entry(de); + + de->de_in_unsubscribe = 0; } /** -- 2.47.2