Hi Aaron, On Tue, 2025-02-04 at 16:50 -0500, Aaron Merey wrote: > * libdw/dwarf_getsrclines.c (read_srcfiles): Initialize Dwarf > member. > * libdw/dwarf_filesrc.c (dwarf_filesrc): Use dwarf_lock. > * libdw/libdwP.h (struct Dwarf_Files_s): Add Dwarf member. > > Signed-off-by: Aaron Merey <ame...@redhat.com> > --- > v2 changes: Combined v1 patches 03/15 and 06/15 into one patch. > > libdw/dwarf_filesrc.c | 13 +++++++++++-- > libdw/dwarf_getsrclines.c | 2 ++ > libdw/libdwP.h | 1 + > 3 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/libdw/dwarf_filesrc.c b/libdw/dwarf_filesrc.c > index d866ce72..a0881f36 100644 > --- a/libdw/dwarf_filesrc.c > +++ b/libdw/dwarf_filesrc.c > @@ -38,14 +38,23 @@ const char * > dwarf_filesrc (Dwarf_Files *file, size_t idx, Dwarf_Word *mtime, > Dwarf_Word *length) > { > - if (file == NULL || idx >= file->nfiles) > + if (file == NULL) > return NULL; > > + mutex_lock (file->dbg->dwarf_lock); > + if (idx >= file->nfiles) > + { > + mutex_unlock (file->dbg->dwarf_lock); > + return NULL; > + } > + > if (mtime != NULL) > *mtime = file->info[idx].mtime; > > if (length != NULL) > *length = file->info[idx].length; > > - return file->info[idx].name; > + const char *res = file->info[idx].name; > + mutex_unlock (file->dbg->dwarf_lock); > + return res; > }
Sorry if we already discussed this, I obviously forgot. But why is this locking needed? Isn't Dwarf_Files fully populated when the user calls this function? The contents of the object will not be changed in any other thread at this point, or does it? > diff --git a/libdw/dwarf_getsrclines.c b/libdw/dwarf_getsrclines.c > index da78db67..b0b5f2eb 100644 > --- a/libdw/dwarf_getsrclines.c > +++ b/libdw/dwarf_getsrclines.c > @@ -717,6 +717,7 @@ read_srcfiles (Dwarf *dbg, > if (unlikely (files == NULL)) > goto no_mem; > > + files->dbg = dbg; > const char **dirs = (void *) &files->info[nfilelist]; > > struct filelist *fileslist = filelist; > @@ -1198,6 +1199,7 @@ read_srclines (Dwarf *dbg, > + (ndirs + 1) * sizeof (char *), > 1); > > + newfiles->dbg = dbg; > > /* Copy prevfiles to newfiles. */ > for (size_t n = 0; n < nprevfiles; n++) > diff --git a/libdw/libdwP.h b/libdw/libdwP.h > index 9d2ffab0..a6bd7e5b 100644 > --- a/libdw/libdwP.h > +++ b/libdw/libdwP.h > @@ -305,6 +305,7 @@ struct Dwarf_Abbrev > /* Files in line information records. */ > struct Dwarf_Files_s > { > + Dwarf *dbg; > unsigned int ndirs; > unsigned int nfiles; > struct Dwarf_Fileinfo_s So the extra Dwarf dbg field is to have a lock (the dwarf_lock dbg field) that is only used in dwarf_filesrc? If so, I think it isn't necessary. But maybe I am confused. Cheers, Mark