From: Mike Brady Date: Sat, 21 Jul 2018 14:35:07 +0000 (+0100) Subject: Fix a bug where the dacp notification handlers are called X-Git-Tag: 3.3RC0~286^2~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2eaaa9cdb3fdd25ba96f165fdf68c813cfacf25f;p=thirdparty%2Fshairport-sync.git Fix a bug where the dacp notification handlers are called --- diff --git a/dacp.c b/dacp.c index 81a6f4d2..667ac19c 100644 --- a/dacp.c +++ b/dacp.c @@ -294,12 +294,10 @@ void relinquish_dacp_server_information(rtsp_conn_info *conn) { // as the conn's connection number // this is to signify that the player has stopped, but only if another thread (with a different // index) hasn't already taken over the dacp service - sps_pthread_mutex_timedlock( - &dacp_server_information_lock, 500000, - "set_dacp_server_information couldn't get DACP server information lock in 0.5 second!.", 2); + debug_mutex_lock(&dacp_server_information_lock, 500000, 2); if (dacp_server.players_connection_thread_index == conn->connection_number) dacp_server.players_connection_thread_index = 0; - pthread_mutex_unlock(&dacp_server_information_lock); + debug_mutex_unlock(&dacp_server_information_lock, 3); } // this will be running on the thread of its caller, not of the conversation thread... @@ -309,9 +307,7 @@ void relinquish_dacp_server_information(rtsp_conn_info *conn) { // Thus, we can keep the DACP port that might have previously been discovered void set_dacp_server_information(rtsp_conn_info *conn) { // debug(1, "set_dacp_server_information"); - sps_pthread_mutex_timedlock( - &dacp_server_information_lock, 500000, - "set_dacp_server_information couldn't get DACP server information lock in 0.5 second!.", 2); + debug_mutex_lock(&dacp_server_information_lock, 500000, 2); dacp_server.players_connection_thread_index = conn->connection_number; if ((conn->dacp_id == NULL) || (strcmp(conn->dacp_id, dacp_server.dacp_id) != 0)) { @@ -360,23 +356,20 @@ void set_dacp_server_information(rtsp_conn_info *conn) { debug(2, "set_dacp_server_information set active-remote id to %" PRIu32 ".", dacp_server.active_remote_id); pthread_cond_signal(&dacp_server_information_cv); - pthread_mutex_unlock(&dacp_server_information_lock); + debug_mutex_unlock(&dacp_server_information_lock, 3); } void dacp_monitor_port_update_callback(char *dacp_id, uint16_t port) { debug(2, "dacp_monitor_port_update_callback with Remote ID \"%s\" and port number %d.", dacp_id, port); - sps_pthread_mutex_timedlock( - &dacp_server_information_lock, 500000, - "dacp_monitor_port_update_callback couldn't get DACP server information lock in 0.5 second!.", - 2); + debug_mutex_lock(&dacp_server_information_lock, 500000, 2); if (strcmp(dacp_id, dacp_server.dacp_id) == 0) { dacp_server.port = port; if (port == 0) dacp_server.scan_enable = 0; else { dacp_server.scan_enable = 1; - debug(2, "dacp_monitor_port_update_callback enables scan"); + // debug(2, "dacp_monitor_port_update_callback enables scan"); } // metadata_hub_modify_prolog(); // int ch = metadata_store.dacp_server_active != dacp_server.scan_enable; @@ -386,11 +379,11 @@ void dacp_monitor_port_update_callback(char *dacp_id, uint16_t port) { debug(1, "dacp port monitor reporting on an out-of-use remote."); } pthread_cond_signal(&dacp_server_information_cv); - pthread_mutex_unlock(&dacp_server_information_lock); + debug_mutex_unlock(&dacp_server_information_lock, 3); } void dacp_monitor_thread_code_cleanup(__attribute__((unused)) void *arg) { - debug(1, "dacp_monitor_thread_code_cleanup called."); + // debug(1, "dacp_monitor_thread_code_cleanup called."); pthread_mutex_unlock(&dacp_server_information_lock); } diff --git a/metadata_hub.c b/metadata_hub.c index 3892e30a..8c957b76 100644 --- a/metadata_hub.c +++ b/metadata_hub.c @@ -127,8 +127,8 @@ void add_metadata_watcher(metadata_watcher fn, void *userdata) { } void metadata_hub_unlock_hub_mutex_cleanup(__attribute__((unused)) void *arg) { - debug(1, "metadata_hub_unlock_hub_mutex_cleanup called."); - pthread_rwlock_wrlock(&metadata_hub_re_lock); + // debug(1, "metadata_hub_unlock_hub_mutex_cleanup called."); + pthread_rwlock_unlock(&metadata_hub_re_lock); } void run_metadata_watchers(void) { diff --git a/player.c b/player.c index 6a2f40aa..5b1fc419 100644 --- a/player.c +++ b/player.c @@ -1683,6 +1683,7 @@ void *player_thread_func(void *arg) { // stop looking elsewhere for DACP stuff #ifdef HAVE_DACP_CLIENT + debug(1, "Set dacp server info"); // this does not have pthread cancellation points in it (assuming avahi doesn't) set_dacp_server_information(conn); // this will start scanning when a port is registered by the // code initiated by the mdns_dacp_monitor @@ -1696,6 +1697,7 @@ void *player_thread_func(void *arg) { // this does not have pthread cancellation points in it (assuming avahi doesn't) conn->dapo_private_storage = mdns_dacp_monitor(conn->dacp_id); // ?? #endif + debug(1, "Get radio"); conn->framesProcessedInThisEpoch = 0; conn->framesGeneratedInThisEpoch = 0; diff --git a/rtsp.c b/rtsp.c index 95b68522..435c4e6e 100644 --- a/rtsp.c +++ b/rtsp.c @@ -1276,7 +1276,7 @@ void metadata_thread_cleanup_function(__attribute__((unused)) void *arg) { } void metadata_pack_cleanup_function(void *arg) { - debug(1, "metadata_pack_cleanup_function called"); + // debug(1, "metadata_pack_cleanup_function called"); metadata_package *pack = (metadata_package *)arg; if (pack->carrier) msg_free(pack->carrier); // release the message @@ -1944,6 +1944,7 @@ void rtsp_conversation_thread_cleanup_function(void *arg) { rtsp_conn_info *conn = (rtsp_conn_info *)arg; debug(1, "Connection %d: rtsp_conversation_thread_func_cleanup_function called.", conn->connection_number); + player_stop(conn); if (conn->fd > 0) close(conn->fd); if (conn->auth_nonce) { @@ -1979,7 +1980,7 @@ void rtsp_conversation_thread_cleanup_function(void *arg) { } void msg_cleanup_function(void *arg) { - debug(1, "msg_cleanup_function called."); + // debug(1, "msg_cleanup_function called."); msg_free((rtsp_message *)arg); } @@ -2133,6 +2134,7 @@ static const char *format_address(struct sockaddr *fsa) { void rtsp_listen_loop_cleanup_handler(__attribute__((unused)) void *arg) { debug(1, "rtsp_listen_loop_cleanup_handler called."); + cancel_all_RTSP_threads(); int *sockfd = (int *)arg; mdns_unregister(); if (sockfd) diff --git a/shairport.c b/shairport.c index 1b4b4250..b4136314 100644 --- a/shairport.c +++ b/shairport.c @@ -1121,7 +1121,7 @@ const char *pid_file_proc(void) { void exit_function() { debug(1, "exit function called..."); - cancel_all_RTSP_threads(); + // cancel_all_RTSP_threads(); if (conns) free(conns); // make sure the connections have been deleted first if (config.service_name)