void dvr_autorec_done(void);
void dvr_autorec_update(void);
+/// Check autorec timers after a short delay.
+void dvr_autorec_async_reschedule(void);
static inline int
dvr_autorec_entry_verify(dvr_autorec_entry_t *dae, access_t *a, int readonly)
}
}
+static void
+dvr_autorec_async_reschedule_cb(void *ignored)
+{
+ tvhdebug(LS_DVR, "dvr_autorec_async_reschedule_cb - begin");
+ dvr_autorec_update();
+ tvhdebug(LS_DVR, "dvr_autorec_async_reschedule_cb - end");
+}
+
+void
+dvr_autorec_async_reschedule(void)
+{
+ tvhtrace(LS_DVR, "dvr_autorec_async_reschedule");
+ static mtimer_t reschedule_timer;
+ mtimer_disarm(&reschedule_timer);
+ /* We schedule the update after a brief period. This allows the
+ * system to quiesce in case the user is doing a large operation
+ * such as deleting numerous records due to disabling an autorec
+ * rule.
+ */
+ mtimer_arm_rel(&reschedule_timer, dvr_autorec_async_reschedule_cb, NULL,
+ sec2mono(60));
+}
+
/**
*
*/
if ((de->de_sched_state == DVR_SCHEDULED) ||
(de->de_sched_state == DVR_RECORDING)) count++;
+ /* We drop this to a debug since on a reschedule numerous emitted */
if (count >= max_count) {
- tvhinfo(LS_DVR, "Autorecord \"%s\": Not scheduling \"%s\" because of autorecord max schedules limit reached",
- dae->dae_name, lang_str_get(e->title, NULL));
+ tvhdebug(LS_DVR, "Autorecord \"%s\": Not scheduling \"%s\" because of autorecord max schedules limit reached",
+ dae->dae_name, lang_str_get(e->title, NULL));
return;
}
}
if (de->de_child)
dvr_entry_change_parent_child(de, NULL, de, delconf);
+ /* Trigger a reschedule in case this entry affects an autorec. For
+ * example, deleting a recording could cause an autorec with a "max
+ * count" to be able to schedule a new recording. We have to do
+ * this even if de was not an autorec since autorecs can interact
+ * with manually scheduled programmes.
+ */
+ dvr_autorec_async_reschedule();
dvr_entry_dec_ref(de);
}