lookup_dwo_unit (dwarf2_cu *cu, die_info *comp_unit_die, const char *dwo_name)
{
#if CXX_STD_THREAD
- /* We need a lock here both to handle the DWO hash table, and BFD,
- which is not thread-safe. */
+ /* We need a lock here both to handle the DWO hash table. */
static std::mutex dwo_lock;
std::lock_guard<std::mutex> guard (dwo_lock);
#include "cli/cli-style.h"
#include <unordered_map>
+#if CXX_STD_THREAD
+
+#include <mutex>
+
+/* Lock held when doing BFD operations. A recursive mutex is used
+ because we use this mutex internally and also for BFD, just to make
+ life a bit simpler, and we may sometimes hold it while calling into
+ BFD. */
+static std::recursive_mutex gdb_bfd_mutex;
+
+/* BFD locking function. */
+
+static bool
+gdb_bfd_lock (void *ignore)
+{
+ gdb_bfd_mutex.lock ();
+ return true;
+}
+
+/* BFD unlocking function. */
+
+static bool
+gdb_bfd_unlock (void *ignore)
+{
+ gdb_bfd_mutex.unlock ();
+ return true;
+}
+
+#endif /* CXX_STD_THREAD */
+
/* An object of this type is stored in the section's user data when
mapping a section. */
name += strlen (TARGET_SYSROOT_PREFIX);
}
+#if CXX_STD_THREAD
+ std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
+#endif
+
if (gdb_bfd_cache == NULL)
gdb_bfd_cache = htab_create_alloc (1, hash_bfd, eq_bfd, NULL,
xcalloc, xfree);
if (abfd == NULL)
return;
+#if CXX_STD_THREAD
+ std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
+#endif
+
gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
bfd_cache_debug_printf ("Increase reference count on bfd %s (%s)",
if (abfd == NULL)
return;
+#if CXX_STD_THREAD
+ std::lock_guard<std::recursive_mutex> guard (gdb_bfd_mutex);
+#endif
+
gdata = (struct gdb_bfd_data *) bfd_usrdata (abfd);
gdb_assert (gdata->refc >= 1);
(*default_bfd_error_handler) (fmt, ap);
}
+/* See gdb_bfd.h. */
+
+void
+gdb_bfd_init ()
+{
+ if (bfd_init () == BFD_INIT_MAGIC)
+ {
+#if CXX_STD_THREAD
+ if (bfd_thread_init (gdb_bfd_lock, gdb_bfd_unlock, nullptr))
+#endif
+ return;
+ }
+
+ error (_("fatal error: libbfd ABI mismatch"));
+}
+
void _initialize_gdb_bfd ();
void
_initialize_gdb_bfd ()
auto temp_uiout = std::make_unique<cli_ui_out> (gdb_stdout);
current_uiout = temp_uiout.get ();
- if (bfd_init () != BFD_INIT_MAGIC)
- error (_("fatal error: libbfd ABI mismatch"));
+ gdb_bfd_init ();
#ifdef __MINGW32__
/* On Windows, argv[0] is not necessarily set to absolute form when