]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvr: move dvr_notify() call to the global_lock using timers, fixes #5437
authorJaroslav Kysela <perex@perex.cz>
Sun, 16 Dec 2018 08:19:33 +0000 (09:19 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 16 Dec 2018 08:19:33 +0000 (09:19 +0100)
src/dvr/dvr.h
src/dvr/dvr_rec.c

index 755b14cfbc2fdce7bbfc4477d68c265cf26ef4c6..1d796058d77d027683513224e446652a3430d598 100644 (file)
@@ -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;
 
index bfa34008c1c79fe7ba178978abe320e9063d4536..922ebf57d74c506122ed42b5ff29557883edb49d 100644 (file)
@@ -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;