Use pthread_rwlock_wrlock instead of the incorrect use of pthread_rdlock_wrlock when tearing down a connection.

This commit is contained in:
Mike Brady
2023-10-31 09:01:24 +00:00
parent d8c741e391
commit 5f9a88fb74
+4 -3
View File
@@ -594,7 +594,8 @@ int get_play_lock(rtsp_conn_info *conn, int allow_session_interruption) {
principal_conn->connection_number);
} else if (allow_session_interruption != 0) {
rtsp_conn_info *previous_principal_conn = principal_conn;
principal_conn = NULL; // no longer the principal conn
// important -- demote the principal conn before cancelling it
principal_conn = NULL;
pthread_cancel(previous_principal_conn->thread);
// the previous principal thread will block on the principal conn lock when exiting
// so it's important not to wait for it here, e.g. don't put in a pthread_join here.
@@ -2715,7 +2716,7 @@ void teardown_phase_two(rtsp_conn_info *conn) {
}
// only update these things if you're (still) the principal conn
pthread_rwlock_rdlock(&principal_conn_lock); // don't let the principal_conn be changed
pthread_rwlock_wrlock(&principal_conn_lock); // don't let the principal_conn be changed
pthread_cleanup_push(rwlock_unlock, (void *)&principal_conn_lock);
if (principal_conn == conn) {
if (conn->airplay_stream_category == ptp_stream) {
@@ -2781,7 +2782,7 @@ void teardown(rtsp_conn_info *conn) {
}
// only update these things if you're (still) the principal conn
pthread_rwlock_rdlock(&principal_conn_lock); // don't let the principal_conn be changed
pthread_rwlock_wrlock(&principal_conn_lock); // don't let the principal_conn be changed
pthread_cleanup_push(rwlock_unlock, (void *)&principal_conn_lock);
if (principal_conn == conn) {
#ifdef CONFIG_AIRPLAY_2