Skip to content

playlist: deadlock if destruction occurs while preparsing directories

The deadlock occurs if a running preparser tries to add items to the playlist while we are trying to destroy the playlist. A simple way of reproducing the issue is to preparse a directory that, in turn, contains a lot of other directories.

/tmp% tree ~/media/music/brian_crain/
/home/refp/media/music/brian_crain/
��� piano_opus.2009
    ��� 01 - Wind.mp3
    ��� 02 - Earth.mp3
    ��� 03 - Water.mp3
    ��� 04 - Fire.mp3
    ��� 05 - Rain.mp3
    ��� 06 - Spring.mp3
    ��� 07 - Summer.mp3
    ��� 08 - Autumn.mp3
    ��� 09 - Winter.mp3
    ��� 10 - Snow.mp3
    ��� 11 - Ice.mp3
    ��� 12 - Canon in D.mp3
    ��� Back.jpg
    ��� Cover.jpg

1 directory, 14 files
/tmp% mkdir stress-test
/tmp% for X in `seq 1 1000`; do ln -s ~/media/music/brian_crain/piano_opus.2009 stress-test/$X; done
/tmp% vlc-devel vlc://pause:1 vlc://quit stress-test

Running the above will have a very good chance of reproducing the following deadlock between the two below listed threads (other threads have been left out for brevity).

Thread 3 (Thread 0x7f06b9ffd700 (LWP 2170)):
 [#0](https://code.videolan.org/videolan/vlc/-/issues/0)  0x00007f06d9642d8c in __lll_lock_wait () from /usr/lib/libpthread.so.0
 [#1](https://code.videolan.org/videolan/vlc/-/issues/1)  0x00007f06d963bb25 in pthread_mutex_lock () from /usr/lib/libpthread.so.0
 [#2](https://code.videolan.org/videolan/vlc/-/issues/2)  0x00007f06da59cc54 in vlc_mutex_lock (p_mutex=p_mutex@entry=0x61500000ea88) at src/posix/thread.c:213
 [#3](https://code.videolan.org/videolan/vlc/-/issues/3)  0x00007f06da4a4380 in playlist_Lock (pl=pl@entry=0x61500000e9b8) at src/playlist/control.c:39
 [#4](https://code.videolan.org/videolan/vlc/-/issues/4)  0x00007f06da4b6e6b in input_item_add_subitem_tree (p_event=0x7f06b9ffcb00, user_data=0x61500000e9b8) at src/playlist/item.c:65
 [#5](https://code.videolan.org/videolan/vlc/-/issues/5)  0x00007f06da57ed3c in vlc_event_send (p_em=0x6130000b67e0, p_event=p_event@entry=0x7f06b9ffcb00) at src/misc/events.c:237
 [#6](https://code.videolan.org/videolan/vlc/-/issues/6)  0x00007f06da4c1aaf in input_item_node_PostAndDelete (p_root=p_root@entry=0x603000049ba0) at src/input/item.c:1333
 [#7](https://code.videolan.org/videolan/vlc/-/issues/7)  0x00007f06cf3f1234 in Demux (p_demux=0x6130000614b8) at modules/demux/playlist/directory.c:80
 [#8](https://code.videolan.org/videolan/vlc/-/issues/8)  0x00007f06da509c47 in demux_Demux (p_demux=0x6130000614b8) at include/vlc_demux.h:347
 [#9](https://code.videolan.org/videolan/vlc/-/issues/9)  MainLoopDemux (pb_changed=<synthetic pointer>, p_input=0x61d0000be138) at src/input/input.c:559
 [#10](https://code.videolan.org/videolan/vlc/-/issues/10) MainLoop (p_input=p_input@entry=0x61d0000be138, b_interactive=b_interactive@entry=false) at src/input/input.c:705
 [#11](https://code.videolan.org/videolan/vlc/-/issues/11) 0x00007f06da50e165 in Preparse (data=0x61d0000be138) at src/input/input.c:522
 [#12](https://code.videolan.org/videolan/vlc/-/issues/12) 0x00007f06d96392e7 in start_thread () from /usr/lib/libpthread.so.0
Thread 1 (Thread 0x7f06dbbe6800 (LWP 2055)):
 [#0](https://code.videolan.org/videolan/vlc/-/issues/0)  0x00007f06d9642d8c in __lll_lock_wait () from /usr/lib/libpthread.so.0
 [#1](https://code.videolan.org/videolan/vlc/-/issues/1)  0x00007f06d963bb96 in pthread_mutex_lock () from /usr/lib/libpthread.so.0
 [#2](https://code.videolan.org/videolan/vlc/-/issues/2)  0x00007f06da59cc54 in vlc_mutex_lock (p_mutex=p_mutex@entry=0x6130000b6810) at src/posix/thread.c:213
 [#3](https://code.videolan.org/videolan/vlc/-/issues/3)  0x00007f06da57f791 in vlc_event_detach (p_em=p_em@entry=0x6130000b67e0, event_type=event_type@entry=vlc_InputItemSubItemTreeAdded, pf_callback=pf_callback@entry=0x7f06da4b6d9a <input_item_add_subitem_tree>, p_user_data=p_user_data@entry=0x61500000e9b8) at src/misc/events.c:288
 [#4](https://code.videolan.org/videolan/vlc/-/issues/4)  0x00007f06da4b4917 in playlist_ItemRelease (p_playlist=p_playlist@entry=0x61500000e9b8, p_item=p_item@entry=0x60400007c190) at src/playlist/item.c:331
 [#5](https://code.videolan.org/videolan/vlc/-/issues/5)  0x00007f06da4b29cb in playlist_NodeDelete (p_playlist=p_playlist@entry=0x61500000e9b8, p_root=0x60400007c190, b_force=b_force@entry=true) at src/playlist/tree.c:150
 [#6](https://code.videolan.org/videolan/vlc/-/issues/6)  0x00007f06da4b1ff7 in playlist_NodeDelete (p_playlist=p_playlist@entry=0x61500000e9b8, p_root=0x604000013390, b_force=b_force@entry=true) at src/playlist/tree.c:101
 [#7](https://code.videolan.org/videolan/vlc/-/issues/7)  0x00007f06da4b1f29 in playlist_NodeDelete (p_playlist=p_playlist@entry=0x61500000e9b8, p_root=0x6040000133d0, b_force=b_force@entry=true) at src/playlist/tree.c:101
 [#8](https://code.videolan.org/videolan/vlc/-/issues/8)  0x00007f06da4a671b in playlist_Destroy (p_playlist=p_playlist@entry=0x61500000e9b8) at src/playlist/engine.c:336
 [#9](https://code.videolan.org/videolan/vlc/-/issues/9)  0x00007f06da49f293 in intf_DestroyAll (libvlc=libvlc@entry=0x61300000d9f8) at src/interface/interface.c:270
 [#10](https://code.videolan.org/videolan/vlc/-/issues/10) 0x00007f06da472b4c in libvlc_InternalCleanup (p_libvlc=0x61300000d9f8) at src/libvlc.c:512
 [#11](https://code.videolan.org/videolan/vlc/-/issues/11) 0x00007f06da8b47a0 in libvlc_release (p_instance=p_instance@entry=0x60e00000df60) at lib/core.c:106
 [#12](https://code.videolan.org/videolan/vlc/-/issues/12) 0x0000000000401a14 in main (i_argc=<optimized out>, ppsz_argv=<optimized out>) at bin/vlc.c:275
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information