Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

playlist: fix deadlock when calling playlist_restore() on certain timing

for example:
<audio> audio_thread
<audio> -audio_playback_handler
<audio> --audio_start_playback
<audio> ---audio_fill_file_buffer
<audio> ----playlist_peek
<main> -playlist_resume { playlist_write_lock(playlist) }
<main> --alloc_tempbuf
<main> ---core_alloc_ex
<main> ----buflib_alloc_ex
<main> -----buflib_compact_and_shrink
<main> ------playback.c:shrink_callback
<main> -------audio_queue_send(Q_AUDIO_STOP)
<main> (waiting for audio queue reply)
<audio> -----get_track_filename { playlist_write_lock(playlist) }
<audio> (waiting for playlist lock)

resolve this by not locking playlist until temporary buffer is allocated

Change-Id: I55a856780d17455b13e2515e096095ae0e9c86c2

mojyack 3892773b ef47ffe2

+3 -2
+3 -2
apps/playlist.c
··· 3159 3159 3160 3160 struct playlist_info* playlist = &current_playlist; 3161 3161 dc_thread_stop(playlist); 3162 - playlist_write_lock(playlist); 3163 3162 3164 3163 if (core_allocatable() < (1 << 10)) 3165 3164 talk_buffer_set_policy(TALK_BUFFER_LOOSE); /* back off voice buffer */ ··· 3172 3171 if (handle < 0) 3173 3172 { 3174 3173 splashf(HZ * 2, "%s(): OOM", __func__); 3175 - goto out; 3174 + return -1; 3176 3175 } 3176 + 3177 + playlist_write_lock(playlist); 3177 3178 3178 3179 /* align buffer for faster load times */ 3179 3180 buffer = core_get_data(handle);