diff options
Diffstat (limited to 'gdbsupport')
-rw-r--r-- | gdbsupport/event-loop.cc | 3 | ||||
-rw-r--r-- | gdbsupport/parallel-for.h | 10 | ||||
-rw-r--r-- | gdbsupport/poison.h | 2 | ||||
-rw-r--r-- | gdbsupport/print-utils.cc | 18 | ||||
-rw-r--r-- | gdbsupport/print-utils.h | 30 | ||||
-rw-r--r-- | gdbsupport/remote-args.h | 7 | ||||
-rw-r--r-- | gdbsupport/run-time-clock.cc | 43 | ||||
-rw-r--r-- | gdbsupport/run-time-clock.h | 33 |
8 files changed, 113 insertions, 33 deletions
diff --git a/gdbsupport/event-loop.cc b/gdbsupport/event-loop.cc index c080490..e7b21e7 100644 --- a/gdbsupport/event-loop.cc +++ b/gdbsupport/event-loop.cc @@ -827,7 +827,8 @@ update_wait_timeout (void) /* Update the timeout for select/ poll. */ #ifdef HAVE_POLL if (use_poll) - gdb_notifier.poll_timeout = timeout.tv_sec * 1000; + gdb_notifier.poll_timeout = (timeout.tv_sec * 1000 + + (timeout.tv_usec + 1000 - 1) / 1000); else #endif /* HAVE_POLL */ { diff --git a/gdbsupport/parallel-for.h b/gdbsupport/parallel-for.h index c485c36..b74c806 100644 --- a/gdbsupport/parallel-for.h +++ b/gdbsupport/parallel-for.h @@ -40,10 +40,9 @@ namespace gdb at least N elements processed per thread. Setting N to 0 is not allowed. */ -template<class RandomIt, class RangeFunction> +template<std::size_t n, class RandomIt, class RangeFunction> void -parallel_for_each (unsigned n, RandomIt first, RandomIt last, - RangeFunction callback) +parallel_for_each (RandomIt first, RandomIt last, RangeFunction callback) { /* If enabled, print debug info about how the work is distributed across the threads. */ @@ -73,7 +72,7 @@ parallel_for_each (unsigned n, RandomIt first, RandomIt last, if (parallel_for_each_debug) { debug_printf (_("Parallel for: n_elements: %zu\n"), n_elements); - debug_printf (_("Parallel for: minimum elements per thread: %u\n"), n); + debug_printf (_("Parallel for: minimum elements per thread: %zu\n"), n); debug_printf (_("Parallel for: elts_per_thread: %zu\n"), elts_per_thread); } @@ -141,8 +140,7 @@ parallel_for_each (unsigned n, RandomIt first, RandomIt last, template<class RandomIt, class RangeFunction> void -sequential_for_each (unsigned n, RandomIt first, RandomIt last, - RangeFunction callback) +sequential_for_each (RandomIt first, RandomIt last, RangeFunction callback) { callback (first, last); } diff --git a/gdbsupport/poison.h b/gdbsupport/poison.h index 791a18f..a91ee5d 100644 --- a/gdbsupport/poison.h +++ b/gdbsupport/poison.h @@ -183,7 +183,7 @@ xnewvar (size_t s) { static_assert (IsMallocable<T>::value, "Trying to use XNEWVAR with a \ non-POD data type."); - return XNEWVAR (T, s);; + return XNEWVAR (T, s); } #undef XNEWVAR diff --git a/gdbsupport/print-utils.cc b/gdbsupport/print-utils.cc index 84a7485..8514720 100644 --- a/gdbsupport/print-utils.cc +++ b/gdbsupport/print-utils.cc @@ -145,7 +145,7 @@ static int thirty_two = 32; /* See print-utils.h. */ const char * -phex (ULONGEST l, int sizeof_l) +phex_ulongest (ULONGEST l, int sizeof_l) { char *str; @@ -170,7 +170,7 @@ phex (ULONGEST l, int sizeof_l) xsnprintf (str, PRINT_CELL_SIZE, "%02x", (unsigned short) (l & 0xff)); break; default: - return phex (l, sizeof (l)); + return phex (l); break; } @@ -180,7 +180,7 @@ phex (ULONGEST l, int sizeof_l) /* See print-utils.h. */ const char * -phex_nz (ULONGEST l, int sizeof_l) +phex_nz_ulongest (ULONGEST l, int sizeof_l) { char *str; @@ -212,7 +212,7 @@ phex_nz (ULONGEST l, int sizeof_l) xsnprintf (str, PRINT_CELL_SIZE, "%x", (unsigned short) (l & 0xff)); break; default: - return phex_nz (l, sizeof (l)); + return phex_nz (l); break; } @@ -226,7 +226,7 @@ hex_string (LONGEST num) { char *result = get_print_cell (); - xsnprintf (result, PRINT_CELL_SIZE, "0x%s", phex_nz (num, sizeof (num))); + xsnprintf (result, PRINT_CELL_SIZE, "0x%s", phex_nz (num)); return result; } @@ -237,7 +237,7 @@ hex_string_custom (LONGEST num, int width) { char *result = get_print_cell (); char *result_end = result + PRINT_CELL_SIZE - 1; - const char *hex = phex_nz (num, sizeof (num)); + const char *hex = phex_nz (num); int hex_len = strlen (hex); if (hex_len > width) @@ -304,8 +304,7 @@ core_addr_to_string (const CORE_ADDR addr) { char *str = get_print_cell (); - strcpy (str, "0x"); - strcat (str, phex (addr, sizeof (addr))); + xsnprintf (str, PRINT_CELL_SIZE, "0x%s", phex (addr)); return str; } @@ -316,8 +315,7 @@ core_addr_to_string_nz (const CORE_ADDR addr) { char *str = get_print_cell (); - strcpy (str, "0x"); - strcat (str, phex_nz (addr, sizeof (addr))); + xsnprintf (str, PRINT_CELL_SIZE, "0x%s", phex_nz (addr)); return str; } diff --git a/gdbsupport/print-utils.h b/gdbsupport/print-utils.h index e50d96f..dc5011c 100644 --- a/gdbsupport/print-utils.h +++ b/gdbsupport/print-utils.h @@ -34,15 +34,35 @@ extern const char *pulongest (ULONGEST u); extern const char *plongest (LONGEST l); -/* Convert a ULONGEST into a HEX string, like %lx, with leading zeros. +/* Convert L (of type ULONGEST) into a hex string, like %lx, with leading + zeros. The result is stored in a circular static buffer, NUMCELLS + deep. */ + +extern const char *phex_ulongest (ULONGEST l, int sizeof_l); + +/* Convert L into a HEX string, like %lx, with leading zeros. The result is stored in a circular static buffer, NUMCELLS deep. */ -extern const char *phex (ULONGEST l, int sizeof_l); +template<typename T> +const char *phex (T l, int sizeof_l = sizeof (T)) +{ + return phex_ulongest (l, sizeof_l); +} + +/* Convert L (of type ULONGEST) into a hex string, like %lx, without leading + zeros. The result is stored in a circular static buffer, NUMCELLS + deep. */ -/* Convert a ULONGEST into a HEX string, like %lx, without leading zeros. - The result is stored in a circular static buffer, NUMCELLS deep. */ +extern const char *phex_nz_ulongest (ULONGEST l, int sizeof_l); + +/* Convert L into a hex string, like %lx, without leading zeros. + The result is stored in a circular static buffer, NUMCELLS deep. */ -extern const char *phex_nz (ULONGEST l, int sizeof_l); +template<typename T> +const char *phex_nz (T l, int sizeof_l = sizeof (T)) +{ + return phex_nz_ulongest (l, sizeof_l); +} /* Converts a LONGEST to a C-format hexadecimal literal and stores it in a static string. Returns a pointer to this string. */ diff --git a/gdbsupport/remote-args.h b/gdbsupport/remote-args.h index 93dbdc6..0533da6 100644 --- a/gdbsupport/remote-args.h +++ b/gdbsupport/remote-args.h @@ -17,6 +17,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#ifndef GDBSUPPORT_REMOTE_ARGS_H +#define GDBSUPPORT_REMOTE_ARGS_H + /* The functions declared here are used when passing inferior arguments from GDB to gdbserver. @@ -52,4 +55,6 @@ extern std::string join (const std::vector<char *> &args); } /* namespace remote_args */ -} /* namespac gdb */ +} /* namespace gdb */ + +#endif /* GDBSUPPORT_REMOTE_ARGS_H */ diff --git a/gdbsupport/run-time-clock.cc b/gdbsupport/run-time-clock.cc index 43da1d9..cda60b0 100644 --- a/gdbsupport/run-time-clock.cc +++ b/gdbsupport/run-time-clock.cc @@ -37,14 +37,51 @@ timeval_to_microseconds (struct timeval *tv) } #endif +/* See run-time-clock.h. */ + +bool +get_run_time_thread_scope_available () +{ +#if defined HAVE_GETRUSAGE && defined RUSAGE_THREAD + return true; +#else + return false; +#endif +} + void -run_time_clock::now (user_cpu_time_clock::time_point &user, - system_cpu_time_clock::time_point &system) noexcept +get_run_time (user_cpu_time_clock::time_point &user, + system_cpu_time_clock::time_point &system, + run_time_scope scope) noexcept { #ifdef HAVE_GETRUSAGE + + /* If we can't provide thread scope run time usage, fallback to + process scope. This will at least be right if GDB is built + without threading support in the first place (or is set to use + zero worker threads). */ +# ifndef RUSAGE_THREAD +# define RUSAGE_THREAD RUSAGE_SELF +# endif + struct rusage rusage; + int who; + + switch (scope) + { + case run_time_scope::thread: + who = RUSAGE_THREAD; + break; + + case run_time_scope::process: + who = RUSAGE_SELF; + break; + + default: + gdb_assert_not_reached ("invalid run_time_scope value"); + } - getrusage (RUSAGE_SELF, &rusage); + getrusage (who, &rusage); microseconds utime = timeval_to_microseconds (&rusage.ru_utime); microseconds stime = timeval_to_microseconds (&rusage.ru_stime); diff --git a/gdbsupport/run-time-clock.h b/gdbsupport/run-time-clock.h index a961f4c..2743514 100644 --- a/gdbsupport/run-time-clock.h +++ b/gdbsupport/run-time-clock.h @@ -51,6 +51,33 @@ struct system_cpu_time_clock static time_point now () noexcept = delete; }; +/* Whether to measure time run time for the whole process or just one + thread. */ + +enum class run_time_scope +{ + process, + thread, +}; + +/* Return the user/system time as separate time points, if + supported. If not supported, then the combined user+kernel time + is returned in USER and SYSTEM is set to zero. + + SCOPE indicates whether to return the run time for the whole + process or just for the calling thread. If the latter isn't + supported, then returns the run time for the whole process even if + run_time_scope::thread is requested. */ + +void get_run_time (user_cpu_time_clock::time_point &user, + system_cpu_time_clock::time_point &system, + run_time_scope scope) noexcept; + +/* Returns true if is it possible for get_run_time above to return the + run time for just the calling thread. */ + +bool get_run_time_thread_scope_available (); + /* Count the total amount of time spent executing in userspace+kernel mode. */ @@ -64,12 +91,6 @@ struct run_time_clock static constexpr bool is_steady = true; static time_point now () noexcept; - - /* Return the user/system time as separate time points, if - supported. If not supported, then the combined user+kernel time - is returned in USER and SYSTEM is set to zero. */ - static void now (user_cpu_time_clock::time_point &user, - system_cpu_time_clock::time_point &system) noexcept; }; #endif /* GDBSUPPORT_RUN_TIME_CLOCK_H */ |