/* Data input */
// Note: this section is protected by mi_input_lock
pthread_t mi_input_tid;
+ mtimer_t mi_input_thread_start;
pthread_mutex_t mi_input_lock;
tvh_cond_t mi_input_cond;
TAILQ_HEAD(,mpegts_packet) mi_input_queue;
}
static void
-mpegts_input_thread_start ( mpegts_input_t *mi )
+mpegts_input_thread_start ( void *aux )
{
+ mpegts_input_t *mi = aux;
mi->mi_running = 1;
tvhthread_create(&mi->mi_table_tid, NULL,
static void
mpegts_input_thread_stop ( mpegts_input_t *mi )
{
+ int running = mi->mi_running;
+
mi->mi_running = 0;
+ mtimer_disarm(&mi->mi_input_thread_start);
/* Stop input thread */
pthread_mutex_lock(&mi->mi_input_lock);
pthread_mutex_unlock(&mi->mi_output_lock);
/* Join threads (relinquish lock due to potential deadlock) */
- pthread_mutex_unlock(&global_lock);
- pthread_join(mi->mi_input_tid, NULL);
- pthread_join(mi->mi_table_tid, NULL);
- pthread_mutex_lock(&global_lock);
+ if (running) {
+ pthread_mutex_unlock(&global_lock);
+ pthread_join(mi->mi_input_tid, NULL);
+ pthread_join(mi->mi_table_tid, NULL);
+ pthread_mutex_lock(&global_lock);
+ }
}
/* **************************************************************************
idnode_load(&mi->ti_id, c);
/* Start threads */
- mpegts_input_thread_start(mi);
+ mtimer_arm_rel(&mi->mi_input_thread_start, mpegts_input_thread_start, mi, NULL);
return mi;
}