]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
DVR: try to fix crashes caused by the idnode changedfn call
authorJaroslav Kysela <perex@perex.cz>
Sun, 9 Apr 2017 19:26:34 +0000 (21:26 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sun, 9 Apr 2017 19:27:06 +0000 (21:27 +0200)
src/dvr/dvr.h
src/dvr/dvr_db.c
src/dvr/dvr_rec.c

index f2504118b4a8abc784a2a390b65c175f1000116c..d4880b88061ae38061f6f5acb8e1d737ba3cacb5 100644 (file)
@@ -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;
 
 
   /**
index 61a920f86125ba991ab81d1b38ce419176e65262..f64dfc61fc80a2cdcb297a4cc0eb40e5a5b47200 100644 (file)
@@ -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);
index 7edd9932d39c75fb663fd724b4f912b0dbc4a3fd..0370325ffee39790a5c86b0b106198321855ce39 100644 (file)
@@ -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;
 }
 
 /**