diff options
author | Tom de Vries <tdevries@suse.de> | 2022-07-15 16:56:56 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2022-07-21 15:06:40 +0200 |
commit | 19947698dedfb490ec4abde00fe8b659a1e6949f (patch) | |
tree | 67d13dac31c78f5462f692bad1dc5076df19dba8 | |
parent | 3164537f2563aaf79630f0ec690859e9f9333618 (diff) | |
download | gdb-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.h | 4 | ||||
-rw-r--r-- | gdb/symmisc.c | 4 |
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 ()) |