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