Race condition between:
...
Read of size 8 at 0x7b640001f2c8 by thread T1:
#0 std::vector<dwarf2_per_cu_data*, std::allocator<dwarf2_per_cu_data*>
>::push_back(dwarf2_per_cu_data* const&)
/usr/include/c++/12/bits/stl_vector.h:1278 (gdb+0x888ad6)
#1 process_full_comp_unit gdb/dwarf2/read.c:8451 (gdb+0x8397d0)
#2 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x8359f5)
...
and:
...
Previous write of size 8 at 0x7b640001f2c8 by main thread:
#0 std::vector<dwarf2_per_cu_data*, std::allocator<dwarf2_per_cu_data*>
>::push_back(dwarf2_per_cu_data* const&)
/usr/include/c++/12/bits/stl_vector.h:1283 (gdb+0x888b52)
#1 process_full_comp_unit gdb/dwarf2/read.c:8451 (gdb+0x8397d0)
#2 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x8359f5)
...
Fix this by doing the just_read_cus push_back in a lock.
per_objfile->set_symtab (cu->per_cu, cust);
- /* Push it for inclusion processing later. */
- per_objfile->per_bfd->just_read_cus.push_back (cu->per_cu);
+#if CXX_STD_THREAD
+ {
+ static std::mutex just_read_cus_lock;
+ std::lock_guard<std::mutex> guard (just_read_cus_lock);
+#endif
+ /* Push it for inclusion processing later. */
+ per_objfile->per_bfd->just_read_cus.push_back (cu->per_cu);
+ }
/* Not needed any more. */
cu->reset_builder ();