]> sourceware.org Git - newlib-cygwin.git/commit
RISC-V: Reliably initialize t0 in _times()
authorChristoph Muellner <cmuellner@linux.com>
Mon, 2 Aug 2021 16:46:16 +0000 (18:46 +0200)
committerCorinna Vinschen <corinna@vinschen.de>
Wed, 4 Aug 2021 09:44:33 +0000 (11:44 +0200)
commit0cb40f415b7d4f11f819b03320770737fa072be8
tree841c7815e0a392bfb60aba1fdb581702e3dbf103
parent94ead7b76d18fbb11e446d35f1afb5c9485d9dca
RISC-V: Reliably initialize t0 in _times()

The current implementation does not reliably initialize t0 once.
Additionally the initialization requires two calls to _gettimeofday().
Let's sacrifice a byte to keep the initialization status
and reduce the maximum number of calls to _gettimeofday().

This has caused issues in an application that invokes clock().
The problematic situation is as follows:

1) The program calls clock() which calls _times().
2) _gettimeofday(&t0, 0) puts 0 in t0.tv_usec (because less than 1 us has
   elapsed since the beginning of time).
3) _gettimeofday(&t, 0) puts 1 in t.tv_usec (since now more than 1 us has
   elapsed since the beginning of time).
4) That call to clock() returns 1 (the value from step 3 minus the value in
   step 2).
5) The program does a second call to clock().
6) The code above still sees 0 in t0 so it tries to update t0 again and
   _gettimeofday(&t0, 0) puts 1 in t0.tv_usec.
7) The _gettimeofday(&t, 0) puts 1 in t.tv_usec (since less than 1us has
   elapsed since step 3).
8) clock() returns 0 (step 7 minus step 6) and indicates that time is
   moving backwards.

Signed-off-by: Christoph Muellner <cmuellner@gcc.gnu.org>
libgloss/riscv/sys_times.c
This page took 0.029246 seconds and 5 git commands to generate.