diff --git a/src/htsp_server.c b/src/htsp_server.c index cbbebe48..5204d5de 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -2374,13 +2374,9 @@ htsp_write_scheduler(void *aux) pthread_mutex_lock(&htsp->htsp_out_mutex); - while(tvheadend_running) { + while(htsp->htsp_writer_run) { if((hmq = TAILQ_FIRST(&htsp->htsp_active_output_queues)) == NULL) { - /* No active queues at all */ - if(!htsp->htsp_writer_run) - break; /* Should not run anymore, bail out */ - /* Nothing to be done, go to sleep */ pthread_cond_wait(&htsp->htsp_out_cond, &htsp->htsp_out_mutex); continue; @@ -2481,6 +2477,13 @@ htsp_serve(int fd, void **opaque, struct sockaddr_storage *source, pthread_mutex_lock(&global_lock); + /* no async notifications from now */ + if(htsp.htsp_async_mode) + LIST_REMOVE(&htsp, htsp_async_link); + + /* deregister this client */ + LIST_REMOVE(&htsp, htsp_link); + /* Beware! Closing subscriptions will invoke a lot of callbacks down in the streaming code. So we do this as early as possible to avoid any weird lockups */ @@ -2488,11 +2491,6 @@ htsp_serve(int fd, void **opaque, struct sockaddr_storage *source, htsp_subscription_destroy(&htsp, s); } - if(htsp.htsp_async_mode) - LIST_REMOVE(&htsp, htsp_async_link); - - LIST_REMOVE(&htsp, htsp_link); - pthread_mutex_unlock(&global_lock); pthread_mutex_lock(&htsp.htsp_out_mutex); @@ -2601,6 +2599,7 @@ htsp_async_send(htsmsg_t *m, int mode) { htsp_connection_t *htsp; + lock_assert(&global_lock); LIST_FOREACH(htsp, &htsp_async_connections, htsp_async_link) if (htsp->htsp_async_mode & mode) htsp_send_message(htsp, htsmsg_copy(m), NULL);