aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2022-07-15 16:56:56 +0200
committerTom de Vries <tdevries@suse.de>2022-07-21 15:06:40 +0200
commit19947698dedfb490ec4abde00fe8b659a1e6949f (patch)
tree67d13dac31c78f5462f692bad1dc5076df19dba8
parent3164537f2563aaf79630f0ec690859e9f9333618 (diff)
downloadgdb-19947698dedfb490ec4abde00fe8b659a1e6949f.zip
gdb-19947698dedfb490ec4abde00fe8b659a1e6949f.tar.gz
gdb-19947698dedfb490ec4abde00fe8b659a1e6949f.tar.bz2
[gdb/symtab] Fix data race in objstats->n_syms
Data race between: ... Read of size 4 at 0x7b4000006dc8 by main thread: #0 new_symbol gdb/dwarf2/read.c:20704 (gdb+0x866f3e) #1 process_die gdb/dwarf2/read.c:8674 (gdb+0x839fa8) #2 read_file_scope gdb/dwarf2/read.c:9610 (gdb+0x83ca7f) #3 process_die gdb/dwarf2/read.c:8614 (gdb+0x839e41) #4 process_full_comp_unit gdb/dwarf2/read.c:8383 (gdb+0x839480) #5 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x83599f) ... and: ... Previous write of size 4 at 0x7b4000006dc8 by thread T2: #0 new_symbol gdb/dwarf2/read.c:20704 (gdb+0x866f5d) #1 process_die gdb/dwarf2/read.c:8674 (gdb+0x839fa8) #2 read_file_scope gdb/dwarf2/read.c:9610 (gdb+0x83ca7f) #3 process_die gdb/dwarf2/read.c:8614 (gdb+0x839e41) #4 process_full_comp_unit gdb/dwarf2/read.c:8383 (gdb+0x839480) #5 process_queue_item gdb/dwarf2/read.c:7592 (gdb+0x83599f) ... Fix by making objstats->n_syms atomic. Likewise for n_types.
-rw-r--r--gdb/objfiles.h4
-rw-r--r--gdb/symmisc.c4
2 files changed, 4 insertions, 4 deletions
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index a35aafb..7803ebb 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -167,13 +167,13 @@ struct entry_info
struct objstats
{
/* Number of full symbols read. */
- int n_syms = 0;
+ std::atomic<int> n_syms {0};
/* Number of ".stabs" read (if applicable). */
int n_stabs = 0;
/* Number of types. */
- int n_types = 0;
+ std::atomic<int> n_types {0};
/* Size of stringtable, (if applicable). */
int sz_strtab = 0;
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index e1d6b20..ad49245 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -66,10 +66,10 @@ print_objfile_statistics (void)
objfile->per_bfd->n_minsyms);
if (OBJSTAT (objfile, n_syms) > 0)
gdb_printf (_(" Number of \"full\" symbols read: %d\n"),
- OBJSTAT (objfile, n_syms));
+ OBJSTAT (objfile, n_syms).load ());
if (OBJSTAT (objfile, n_types) > 0)
gdb_printf (_(" Number of \"types\" defined: %d\n"),
- OBJSTAT (objfile, n_types));
+ OBJSTAT (objfile, n_types).load ());
i = linetables = 0;
for (compunit_symtab *cu : objfile->compunits ())