Deadlock in libxml2 when multithreaded tests are run
Sometimes cargo test
will hang inside the librsvg_crate/tests/intrinsic-dimensions
test. It's a deadlock in libxml2; see these two threads:
(gdb) t a a bt
Thread 3 (Thread 0x7fdbee248700 (LWP 27816)):
#0 0x00007fdbefa4a3dd in __lll_lock_wait () at /lib64/libpthread.so.0
#1 0x00007fdbefa43705 in pthread_mutex_lock () at /lib64/libpthread.so.0
#2 0x00007fdbefed9f19 in xmlInitializeGlobalState () at /usr/lib64/libxml2.so.2
#3 0x00007fdbefedaf47 in xmlGetGlobalState () at /usr/lib64/libxml2.so.2
#4 0x00007fdbefeda495 in __xmlDefaultBufferSize () at /usr/lib64/libxml2.so.2
#5 0x00007fdbefe95c2a in xmlAllocParserInputBuffer () at /usr/lib64/libxml2.so.2
#6 0x00007fdbefe96469 in xmlParserInputBufferCreateIO () at /usr/lib64/libxml2.so.2
#7 0x00007fdbefe7d73a in xmlCreateIOParserCtxt () at /usr/lib64/libxml2.so.2
#8 0x00005593dc958152 in rsvg_internals::xml2_load::Xml2Parser::from_stream (xml=0x7fdbee246108, load_flags=..., stream=..., cancellable=...) at rsvg_internals/src/xml2_load.rs:336
#9 0x00005593dc958c86 in rsvg_internals::xml2_load::xml_state_parse_from_stream (xml=0x7fdbee246108, load_flags=..., stream=..., cancellable=...) at rsvg_internals/src/xml2_load.rs:444
#10 0x00005593dc958ed2 in rsvg_internals::xml2_load::xml_state_load_from_possibly_compressed_stream (xml=0x7fdbee246108, load_flags=..., stream=0x7fdbee247080, cancellable=...)
at rsvg_internals/src/xml2_load.rs:456
#11 0x00005593dc9f669b in rsvg_internals::svg::Svg::load_from_stream (load_options=0x7fdbee2467b0, stream=0x7fdbee247080, cancellable=...) at rsvg_internals/src/svg.rs:60
#12 0x00005593dc9c476e in rsvg_internals::handle::Handle::read_stream_sync (self=0x7fdbee246bc0, stream=0x7fdbee247080, cancellable=...) at rsvg_internals/src/handle.rs:210
#13 0x00005593dc9c6748 in rsvg_internals::handle::Handle::construct_read_stream_sync (self=0x7fdbee246bc0, stream=0x7fdbee247080, base_file=..., cancellable=...)
at rsvg_internals/src/handle.rs:653
#14 0x00005593dc808617 in librsvg::Loader::read_stream (self=..., stream=0x7fdbee247080, base_file=..., cancellable=...)
at /home/federico/src/librsvg/viewport-with-offsets/librsvg_crate/src/lib.rs:287
#15 0x00005593dc80a201 in intrinsic_dimensions::load_svg (input=...) at librsvg_crate/tests/intrinsic-dimensions.rs:25
#16 0x00005593dc80a882 in intrinsic_dimensions::root_geometry_with_percent_viewport () at librsvg_crate/tests/intrinsic-dimensions.rs:73
...
Thread 2 (Thread 0x7fdbee449700 (LWP 27815)):
#0 0x00007fdbefa4a3dd in __lll_lock_wait () at /lib64/libpthread.so.0
#1 0x00007fdbefa43705 in pthread_mutex_lock () at /lib64/libpthread.so.0
#2 0x00007fdbefed9f19 in xmlInitializeGlobalState () at /usr/lib64/libxml2.so.2
#3 0x00007fdbefedaf47 in xmlGetGlobalState () at /usr/lib64/libxml2.so.2
#4 0x00007fdbefeda495 in __xmlDefaultBufferSize () at /usr/lib64/libxml2.so.2
#5 0x00007fdbefe95c2a in xmlAllocParserInputBuffer () at /usr/lib64/libxml2.so.2
#6 0x00007fdbefe96469 in xmlParserInputBufferCreateIO () at /usr/lib64/libxml2.so.2
#7 0x00007fdbefe7d73a in xmlCreateIOParserCtxt () at /usr/lib64/libxml2.so.2
#8 0x00005593dc958152 in rsvg_internals::xml2_load::Xml2Parser::from_stream (xml=0x7fdbee4472e8, load_flags=..., stream=..., cancellable=...) at rsvg_internals/src/xml2_load.rs:336
#9 0x00005593dc958c86 in rsvg_internals::xml2_load::xml_state_parse_from_stream (xml=0x7fdbee4472e8, load_flags=..., stream=..., cancellable=...) at rsvg_internals/src/xml2_load.rs:444
#10 0x00005593dc958ed2 in rsvg_internals::xml2_load::xml_state_load_from_possibly_compressed_stream (xml=0x7fdbee4472e8, load_flags=..., stream=0x7fdbee448260, cancellable=...)
at rsvg_internals/src/xml2_load.rs:456
#11 0x00005593dc9f669b in rsvg_internals::svg::Svg::load_from_stream (load_options=0x7fdbee447990, stream=0x7fdbee448260, cancellable=...) at rsvg_internals/src/svg.rs:60
#12 0x00005593dc9c476e in rsvg_internals::handle::Handle::read_stream_sync (self=0x7fdbee447da0, stream=0x7fdbee448260, cancellable=...) at rsvg_internals/src/handle.rs:210
#13 0x00005593dc9c6748 in rsvg_internals::handle::Handle::construct_read_stream_sync (self=0x7fdbee447da0, stream=0x7fdbee448260, base_file=..., cancellable=...)
at rsvg_internals/src/handle.rs:653
#14 0x00005593dc808617 in librsvg::Loader::read_stream (self=..., stream=0x7fdbee448260, base_file=..., cancellable=...)
at /home/federico/src/librsvg/viewport-with-offsets/librsvg_crate/src/lib.rs:287
#15 0x00005593dc80a201 in intrinsic_dimensions::load_svg (input=...) at librsvg_crate/tests/intrinsic-dimensions.rs:25
#16 0x00005593dc80a2b2 in intrinsic_dimensions::no_intrinsic_dimensions () at librsvg_crate/tests/intrinsic-dimensions.rs:32
...
We may need to call xmlInitParser()
after all.
Setting milestone to the 2.44 series since this is a latent bug for multithreaded apps, anyway.