libctf: avoid nonportable __thread in CTF archive handling
authorNick Alcock <nick.alcock@oracle.com>
Fri, 13 Dec 2019 14:48:07 +0000 (14:48 +0000)
committerNick Alcock <nick.alcock@oracle.com>
Fri, 26 Jun 2020 14:56:39 +0000 (15:56 +0100)
This keeps archive searching threadsafe using the new bsearch_r that was
just added to libiberty.

PR25120
libctf/
* ctf-archive.c (search_nametbl): No longer global: declare...
(ctf_arc_open_by_name_internal): ... here. Use bsearch_r.
(search_modent_by_name): Take and use ARG for the nametbl.

libctf/ChangeLog
libctf/ctf-archive.c

index 5e473a75cd021878b9d2c68d34c65fc294c15734..62c2cc531ec32437e1019be968056b49dabcbd39 100644 (file)
@@ -1,3 +1,10 @@
+2020-06-26  Nick Alcock  <nick.alcock@oracle.com>
+
+       PR libctf/25120
+       * ctf-archive.c (search_nametbl): No longer global: declare...
+       (ctf_arc_open_by_name_internal): ... here. Use bsearch_r.
+       (search_modent_by_name): Take and use ARG for the nametbl.
+
 2020-06-26  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-impl.h (ctf_new_archive_internal): Declare.
index d27b27ef86c9f31cde139ebe20b72d9800a5820e..ac13d6dd5e9e7a632ffde80fa6dac1f67f619a3b 100644 (file)
@@ -44,9 +44,6 @@ static int arc_mmap_writeout (int fd, void *header, size_t headersz,
                              const char **errmsg);
 static int arc_mmap_unmap (void *header, size_t headersz, const char **errmsg);
 
-/* bsearch() internal state.  */
-static __thread char *search_nametbl;
-
 /* Write out a CTF archive to the start of the file referenced by the passed-in
    fd.  The entries in CTF_FILES are referenced by name: the names are passed in
    the names array, which must have CTF_FILES entries.
@@ -332,13 +329,14 @@ sort_modent_by_name (const void *one, const void *two, void *n)
                 &nametbl[le64toh (b->name_offset)]);
 }
 
-/* bsearch() function to search for a given name in the sorted array of struct
+/* bsearch_r() function to search for a given name in the sorted array of struct
    ctf_archive_modents.  */
 static int
-search_modent_by_name (const void *key, const void *ent)
+search_modent_by_name (const void *key, const void *ent, void *arg)
 {
   const char *k = key;
   const struct ctf_archive_modent *v = ent;
+  const char *search_nametbl = arg;
 
   return strcmp (k, &search_nametbl[le64toh (v->name_offset)]);
 }
@@ -503,6 +501,7 @@ ctf_arc_open_by_name_internal (const struct ctf_archive *arc,
                               const char *name, int *errp)
 {
   struct ctf_archive_modent *modent;
+  const char *search_nametbl;
 
   if (name == NULL)
     name = _CTF_SECTION;                /* The default name.  */
@@ -512,10 +511,10 @@ ctf_arc_open_by_name_internal (const struct ctf_archive *arc,
   modent = (ctf_archive_modent_t *) ((char *) arc
                                     + sizeof (struct ctf_archive));
 
-  search_nametbl = (char *) arc + le64toh (arc->ctfa_names);
-  modent = bsearch (name, modent, le64toh (arc->ctfa_nfiles),
-                   sizeof (struct ctf_archive_modent),
-                   search_modent_by_name);
+  search_nametbl = (const char *) arc + le64toh (arc->ctfa_names);
+  modent = bsearch_r (name, modent, le64toh (arc->ctfa_nfiles),
+                     sizeof (struct ctf_archive_modent),
+                     search_modent_by_name, (void *) search_nametbl);
 
   /* This is actually a common case and normal operation: no error
      debug output.  */