Ensure index cache entry written in test
authorTom Tromey <tromey@adacore.com>
Fri, 3 Mar 2023 16:41:35 +0000 (09:41 -0700)
committerTom Tromey <tromey@adacore.com>
Tue, 7 Mar 2023 14:58:30 +0000 (07:58 -0700)
Now that index cache files are written in the background, one test in
index-cache.exp is racy -- it assumes that the cache file will have
been written during startup.

This patch fixes the problem by introducing a new maintenance command
to wait for all pending writes to the index cache.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
gdb/NEWS
gdb/doc/gdb.texinfo
gdb/dwarf2/cooked-index.c
gdb/testsuite/gdb.base/index-cache.exp

index c32ff92c98a14f569f6bf8651fc6bb75c2d5e244..8827efaefb62ef8d514bc361a806c5d9f42bf576 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -68,6 +68,9 @@ maintenance info frame-unwinders
   List the frame unwinders currently in effect, starting with the highest
   priority.
 
+maintenance wait-for-index-cache
+  Wait until all pending writes to the index cache have completed.
+
 set always-read-ctf on|off
 show always-read-ctf
   When off, CTF is only read if DWARF is not present.  When on, CTF is
index bfda7edc4f7ffd6882057457b30b37e77107f0cc..954f1481dae0c4fd6689e3119cd07fe1b5af6386 100644 (file)
@@ -41374,6 +41374,12 @@ give an error.
 For platforms that do support creating the backtrace this feature is
 @code{on} by default.
 
+@kindex maint wait-for-index-cache
+@item maint wait-for-index-cache
+Wait until all pending writes to the index cache have completed.  This
+is used by the test suite to avoid races when the index cache is being
+updated by a worker thread.
+
 @kindex maint with
 @item maint with @var{setting} [@var{value}] [-- @var{command}]
 Like the @code{with} command, but works with @code{maintenance set}
index 47746aa9905b06c8923f23efc4e847adfebcd77a..d09faed268df50d328a4c5b56fbca08fcafd87b0 100644 (file)
@@ -33,6 +33,7 @@
 #include "gdbsupport/selftest.h"
 #include <chrono>
 #include <unordered_set>
+#include "cli/cli-cmds.h"
 
 /* We don't want gdb to exit while it is in the process of writing to
    the index cache.  So, all live cooked index vectors are stored
@@ -640,6 +641,14 @@ wait_for_index_cache (int)
     item->wait_completely ();
 }
 
+/* A maint command to wait for the cache.  */
+
+static void
+maintenance_wait_for_index_cache (const char *args, int from_tty)
+{
+  wait_for_index_cache (0);
+}
+
 void _initialize_cooked_index ();
 void
 _initialize_cooked_index ()
@@ -648,5 +657,11 @@ _initialize_cooked_index ()
   selftests::register_test ("cooked_index_entry::compare", test_compare);
 #endif
 
+  add_cmd ("wait-for-index-cache", class_maintenance,
+          maintenance_wait_for_index_cache, _("\
+Usage: maintenance wait-for-index-cache\n\
+Wait until all pending writes to the index cache have completed."),
+          &maintenancelist);
+
   gdb::observers::gdb_exiting.attach (wait_for_index_cache, "cooked-index");
 }
index 0614d4ee2db41fa017adbbe2eab88d875f49e4d1..ec69f0f11ad6e2b7ad1ac1d9103ca37bddaafd9b 100644 (file)
@@ -84,6 +84,10 @@ proc run_test_with_flags { cache_dir cache_enabled code } {
 
        clean_restart ${testfile}
 
+       # The tests generally want to check the cache, so make sure it
+       # has completed its work.
+       gdb_test_no_output "maintenance wait-for-index-cache"
+
        uplevel 1 $code
     }
 }
@@ -201,7 +205,9 @@ proc_with_prefix test_cache_enabled_hit { cache_dir } {
     global expecting_index_cache_use
 
     # Just to populate the cache.
-    run_test_with_flags $cache_dir on {}
+    with_test_prefix "populate cache" {
+       run_test_with_flags $cache_dir on {}
+    }
 
     lassign [ls_host $cache_dir] ret files_before