binutils-gdb/gdb/common
Pedro Alves dcb07cfa15 gdb: Use C++11 std::chrono
This patch fixes a few problems with GDB's time handling.

#1 - It avoids problems with gnulib's C++ namespace support

On MinGW, the struct timeval that should be passed to gnulib's
gettimeofday replacement is incompatible with libiberty's
timeval_sub/timeval_add.  That's because gnulib also replaces "struct
timeval" with its own definition, while libiberty expects the
system's.

E.g., in code like this:

  gettimeofday (&prompt_ended, NULL);
  timeval_sub (&prompt_delta, &prompt_ended, &prompt_started);
  timeval_add (&prompt_for_continue_wait_time,
               &prompt_for_continue_wait_time, &prompt_delta);

That's currently handled in gdb by not using gnulib's gettimeofday at
all (see common/gdb_sys_time.h), but that #undef hack won't work with
if/when we enable gnulib's C++ namespace support, because that mode
adds compile time warnings for uses of ::gettimeofday, which are hard
errors with -Werror.

#2 - But there's an elephant in the room: gettimeofday is not monotonic...

We're using it to:

  a) check how long functions take, for performance analysis
  b) compute when in the future to fire events in the event-loop
  c) print debug timestamps

But that's exactly what gettimeofday is NOT meant for.  Straight from
the man page:

~~~
       The time returned by gettimeofday() is affected by
       discontinuous jumps in the system time (e.g., if the system
       administrator manually changes the system time).  If you need a
       monotonically increasing clock, see clock_gettime(2).
~~~

std::chrono (part of the C++11 standard library) has a monotonic clock
exactly for such purposes (std::chrono::steady_clock).  This commit
switches to use that instead of gettimeofday, fixing all the issues
mentioned above.

gdb/ChangeLog:
2016-11-23  Pedro Alves  <palves@redhat.com>

	* Makefile.in (SFILES): Add common/run-time-clock.c.
	(HFILES_NO_SRCDIR): Add common/run-time-clock.h.
	(COMMON_OBS): Add run-time-clock.o.
	* common/run-time-clock.c, common/run-time-clock.h: New files.
	* defs.h (struct timeval, print_transfer_performance): Delete
	declarations.
	* event-loop.c (struct gdb_timer) <when>: Now a
	std::chrono::steady_clock::time_point.
	(create_timer): use std::chrono::steady_clock instead of
	gettimeofday.  Use new instead of malloc.
	(delete_timer): Use delete instead of xfree.
	(duration_cast_timeval): New.
	(update_wait_timeout): Use std::chrono::steady_clock instead of
	gettimeofday.
	* maint.c: Include <chrono> instead of "gdb_sys_time.h", <time.h>
	and "timeval-utils.h".
	(scoped_command_stats::~scoped_command_stats)
	(scoped_command_stats::scoped_command_stats): Use
	std::chrono::steady_clock instead of gettimeofday.  Use
	user_cpu_time_clock instead of get_run_time.
	* maint.h: Include "run-time-clock.h" and <chrono>.
	(scoped_command_stats): <m_start_cpu_time>: Now a
	user_cpu_time_clock::time_point.
	<m_start_wall_time>: Now a std::chrono::steady_clock::time_point.
	* mi/mi-main.c: Include "run-time-clock.h" and <chrono> instead of
	"gdb_sys_time.h" and <sys/resource.h>.
	(rusage): Delete.
	(mi_execute_command): Use new instead of XNEW.
	(mi_load_progress): Use std::chrono::steady_clock instead of
	gettimeofday.
	(timestamp): Rewrite in terms of std::chrono::steady_clock,
	user_cpu_time_clock and system_cpu_time_clock.
	(timeval_diff): Delete.
	(print_diff): Adjust to use std::chrono::steady_clock,
	user_cpu_time_clock and system_cpu_time_clock.
	* mi/mi-parse.h: Include "run-time-clock.h" and <chrono> instead
	of "gdb_sys_time.h".
	(struct mi_timestamp): Change fields types to
	std::chrono::steady_clock::time_point, user_cpu_time_clock::time
	and system_cpu_time_clock::time_point, instead of struct timeval.
	* symfile.c: Include <chrono> instead of <time.h> and
	"gdb_sys_time.h".
	(struct time_range): New.
	(generic_load): Use std::chrono::steady_clock instead of
	gettimeofday.
	(print_transfer_performance): Replace timeval parameters with a
	std::chrono::steady_clock::duration parameter.  Adjust.
	* utils.c: Include <chrono> instead of "timeval-utils.h",
	"gdb_sys_time.h", and <time.h>.
	(prompt_for_continue_wait_time): Now a
	std::chrono::steady_clock::duration.
	(defaulted_query, prompt_for_continue): Use
	std::chrono::steady_clock instead of
	gettimeofday/timeval_sub/timeval_add.
	(reset_prompt_for_continue_wait_time): Use
	std::chrono::steady_clock::duration instead of struct timeval.
	(get_prompt_for_continue_wait_time): Return a
	std::chrono::steady_clock::duration instead of struct timeval.
	(vfprintf_unfiltered): Use std::chrono::steady_clock instead of
	gettimeofday.  Use std::string.  Use '.' instead of ':'.
	* utils.h: Include <chrono>.
	(get_prompt_for_continue_wait_time): Return a
	std::chrono::steady_clock::duration instead of struct timeval.

gdb/gdbserver/ChangeLog:
2016-11-23  Pedro Alves  <palves@redhat.com>

	* debug.c: Include <chrono> instead of "gdb_sys_time.h".
	(debug_vprintf): Use std::chrono::steady_clock instead of
	gettimeofday.  Use '.' instead of ':'.
	* tracepoint.c: Include <chrono> instead of "gdb_sys_time.h".
	(get_timestamp): Use std::chrono::steady_clock instead of
	gettimeofday.
2016-11-23 15:36:26 +00:00
..
agent.c
agent.h
ax.def
break-common.h
btrace-common.c Add method/format information to =record-started 2016-06-06 17:10:18 -04:00
btrace-common.h Add method/format information to =record-started 2016-06-06 17:10:18 -04:00
buffer.c
buffer.h
cleanups.c
cleanups.h
common-debug.c
common-debug.h
common-defs.h Delete gdb::unique_ptr/gdb::move 2016-11-15 19:54:21 +00:00
common-exceptions.c
common-exceptions.h gdb: Remove some C compiler support leftovers 2016-10-06 19:23:37 +01:00
common-regcache.c
common-regcache.h
common-types.h
common-utils.c Introduce string_printf 2016-11-08 15:26:42 +00:00
common-utils.h Introduce string_printf 2016-11-08 15:26:42 +00:00
common.host
common.m4 Fix PR gdb/18653: gdb disturbs inferior's inherited signal dispositions 2016-08-09 20:16:20 +01:00
create-version.sh
enum-flags.h
errors.c
errors.h
fileio.c
fileio.h
filestuff.c
filestuff.h
format.c
format.h
gdb_assert.h
gdb_locale.h gdb: Fix build breakage with GCC 4.1 and --disable-nls 2016-09-19 16:55:35 +01:00
gdb_setjmp.h
gdb_signals.h
gdb_sys_time.h
gdb_unique_ptr.h Delete gdb::unique_ptr/gdb::move 2016-11-15 19:54:21 +00:00
gdb_vecs.c
gdb_vecs.h
gdb_wait.h
host-defs.h
mingw-strerror.c
new-op.c new-op.c: Add comment about -fsanitize=address 2016-10-25 13:32:26 +01:00
posix-strerror.c
print-utils.c
print-utils.h
ptid.c
ptid.h
queue.h
rsp-low.c
rsp-low.h
run-time-clock.c gdb: Use C++11 std::chrono 2016-11-23 15:36:26 +00:00
run-time-clock.h gdb: Use C++11 std::chrono 2016-11-23 15:36:26 +00:00
scoped_restore.h Use RAII to save and restore scalars 2016-10-21 14:17:31 -06:00
signals-state-save-restore.c Quiet ARI gettext checks 2016-08-10 16:06:57 +01:00
signals-state-save-restore.h Fix PR gdb/18653: gdb disturbs inferior's inherited signal dispositions 2016-08-09 20:16:20 +01:00
signals.c Pass SIGLIBRT directly to child processes. 2016-07-15 06:35:37 -07:00
symbol.h
vec.c
vec.h
version.h
x86-xstate.h
xml-utils.c
xml-utils.h