dvr_rec_unsubscribe(dvr_entry_t *de)
{
profile_chain_t *prch = de->de_chain;
+ char *postproc = NULL;
assert(de->de_s != NULL);
assert(prch != NULL);
atomic_add(&de->de_thread_shutdown, 1);
- pthread_join(de->de_thread, NULL);
+ pthread_join(de->de_thread, (void **)&postproc);
+
+ if (prch->prch_muxer)
+ dvr_thread_epilog(de, postproc);
+
+ free(postproc);
subscription_unsubscribe(de->de_s, UNSUBSCRIBE_FINAL);
de->de_s = NULL;
// Try to restart the recording if the muxer doesn't
// support reconfiguration of the streams.
+ if (!dvr_thread_global_lock(de, run)) {
+ *dts_offset = PTS_UNSET;
+ *started = 0;
+ return 0;
+ }
dvr_thread_epilog(de, postproc);
*dts_offset = PTS_UNSET;
*started = 0;
- if (!dvr_thread_global_lock(de, run))
- return 0;
if (de->de_config->dvr_clone)
*_de = dvr_entry_clone(de);
dvr_thread_global_unlock(de);
fin:
streaming_queue_clear(&backlog);
- dvr_thread_epilog(de, postproc);
+ if (!dvr_thread_global_lock(de, &run))
+ break;
+ dvr_thread_epilog(de, postproc);
+ dvr_thread_global_unlock(de);
start_time = 0;
started = 0;
muxing = 0;
streaming_queue_clear(&backlog);
- if (prch->prch_muxer)
- dvr_thread_epilog(de, postproc);
-
if (ss)
streaming_start_unref(ss);
- free(postproc);
- return NULL;
+ return postproc;
}
/**
htsmsg_t *e;
htsmsg_field_t *f;
+ lock_assert(&global_lock);
+
if (prch == NULL)
return;