This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 00/12] Y2038 preparation: use clock_[gs]ettime to implement the other time-getting and -setting functions


On Tue, Aug 20, 2019 at 6:21 AM Zack Weinberg <zackw@panix.com> wrote:
>
> This patchset aims to make the Y2038 project a little easier by
> implementing the other time-getting and time-setting functions
> (time, ftime, stime, gettimeofday, and settimeofday) in terms of
> clock_gettime and clock_settime.  Internal uses of (__)gettimeofday
> are also all changed to __clock_gettime.  Internal uses of time() are
> mostly left alone, since time() is easier and clearer when you don’t
> care about sub-second resolution and don’t need a struct timespec for
> some other reason.

Thanks for the series, this should help. I'll rebase my work ontop of
this once it's merged into master.

>
> As a consequence, gettimeofday will no longer report crude timezone
> information under any circumstances.  If its ‘tzp’ argument is not
> NULL, it will write zeroes to both fields of the ‘struct timezone’,
> even if the gettimeofday system call exists and would have produced
> different output.  Similarly, ftime will always write zeroes to the
> timezone and dstflag fields of ‘struct timeb’.  Joseph Myers raised an
> objection to this change; I rebutted the objection, and he did not
> reply; I do not think either of us will persuade the other, so I’m
> formally asking for a third maintainer to make a decision.

I like this and think it makes a lot of sense.

Alistair

>
> settimeofday _will_ still call the settimeofday system call and pass
> down a non-null ‘tzp’ argument if it receives one, but, if _both_ of
> its arguments are non-null, it will fail and set errno to EINVAL.
> Also, its invocation of a settimeofday system call goes through an
> internal sysdep function called __settimezone.  On the Hurd this is an
> unconditional ENOSYS stub, and on Linux it’s an ENOSYS stub when
> __NR_settimeofday is not defined.
>
> Relatedly, there is a macro-based hack to issue warnings when
> gettimeofday is called with a ‘tzp’ argument that is not a
> compile-time null pointer.  I think this is probably a better option
> at this stage than various suggested alternatives (e.g. renaming the
> fields of ‘struct timezone’, or removing it from sys/time.h
> altogether) because the remaining valid uses of settimeofday with
> non-null ‘tzp’ should still be able to use struct timezone.  The hack
> is in a separate patch because, well, it’s a hack and I’m hoping
> someone has a better implementation idea.  (I tried an inline function
> instead of a macro, but it threw false positives all over the place on
> ‘gettimeofday (&tv, 0)’...)
>
> This patchset also includes an overhaul of Linux/Alpha’s GLIBC_2.0
> compatibility symbols for several system calls that consume or produce
> struct timeval.  It appears that early releases of glibc and/or Linux
> for Alpha attempted to achieve some degree of binary compatibility
> with OSF/1, but this came at the expense of using 32-bit time_t inside
> struct timeval.  Up till now, we were invoking compatibility system
> calls from the compatibility symbols.  This patch changes them to wrap
> the 64-bit implementations and convert between 32-bit and 64-bit
> struct timeval in user space.  If a 64-bit tv_sec value returned by
> the kernel is found to be greater than INT32_MAX, the caller will
> receive a saturated 32-bit struct timeval, { INT32_MAX, 0 }, and the
> function will return -1 with errno set to EOVERFLOW.  Because many of
> these calls are assumed unable to fail, we make sure to write all the
> fields of any output data structure even when this happens.  I did
> this partially because it simplified conversion of gettimeofday to
> call clock_gettime, and partially as a worked example of the semantics
> that I think are probably best for the 32-bit time_t compatibility
> symbols we’re going to have to add for many other architectures.
> Comments on these semantics are requested.
>
> This patchset also includes a partial revision of manual/time.texi.
> clock_gettime and clock_settime are now documented, and the
> obsolescent status of stime, settimeofday, and gettimeofday is
> clearer.  I only documented CLOCK_REALTIME and CLOCK_MONOTONIC,
> because most of the other clock constants are either extremely
> Linux-specific or they have to do with measuring CPU time, and I
> didn’t touch the measuring-CPU-time part of time.texi.  (That part
> also deserves a rewrite, but I don’t know enough about the topic and
> this patchset is already long enough.)
>
> Finally, there is a case for demoting ftime and stime to compatibility
> symbols and removing their public prototypes (for ftime, we would stop
> installing <sys/timeb.h> altogether).  I tried to investigate how much
> this might break, using codesearch.debian.net, but the identifiers
> ‘ftime’ and ‘stime’ turn out to be heavily used for unrelated
> purposes, so I didn’t get anywhere.
>
> Zack Weinberg (12):
>   Remove implementations of clock_[gs]ettime using [gs]ettimeofday.
>   Change most internal uses of __gettimeofday to __clock_gettime.
>   Don’t use the argument to time.
>   Use clock_settime to implement stime.
>   Use clock_settime to implement settimeofday.
>   Use clock_gettime to implement time.
>   Use clock_gettime to implement ftime.
>   Use clock_gettime to implement gettimeofday.
>   Finish move of clock_* functions to libc.
>   Warn when gettimeofday is called with non-null tzp argument.
>   Linux/Alpha: don’t use timeval32 system calls.
>   Revise the documentation of ‘simple calendar time’.
>
>  NEWS                                          |   53 +-
>  include/sys/time.h                            |    7 +-
>  include/time.h                                |    4 +-
>  inet/deadline.c                               |    9 +-
>  login/logout.c                                |    9 +-
>  login/logwtmp.c                               |    7 +-
>  manual/filesys.texi                           |    2 +-
>  manual/llio.texi                              |   10 +-
>  manual/threads.texi                           |    2 +-
>  manual/time.texi                              | 1062 +++++++++--------
>  misc/syslog.c                                 |    2 +-
>  nis/nis_call.c                                |    4 +-
>  nptl/pthread_join_common.c                    |    7 +-
>  nptl/pthread_mutex_timedlock.c                |    7 +-
>  nscd/nscd_helper.c                            |   24 +-
>  resolv/gai_misc.c                             |    6 +-
>  resolv/gai_suspend.c                          |    6 +-
>  resolv/res_send.c                             |    6 +-
>  rt/Makefile                                   |   15 +-
>  rt/Versions                                   |    7 +-
>  rt/clock-compat.c                             |   63 -
>  string/strfry.c                               |    2 +-
>  sunrpc/auth_des.c                             |   19 +-
>  sunrpc/auth_unix.c                            |    9 +-
>  sunrpc/create_xid.c                           |    6 +-
>  sunrpc/svcauth_des.c                          |    7 +-
>  support/support_test_main.c                   |   14 +-
>  sysdeps/generic/memusage.h                    |   16 +-
>  .../mach/{gettimeofday.c => clock_gettime.c}  |   25 +-
>  .../hurd/{settimeofday.c => clock_settime.c}  |   27 +-
>  sysdeps/mach/hurd/getitimer.c                 |    3 +-
>  sysdeps/mach/hurd/i386/libc.abilist           |    1 -
>  sysdeps/mach/hurd/i386/librt.abilist          |    5 -
>  sysdeps/mach/hurd/setitimer.c                 |    3 +-
>  sysdeps/mach/hurd/times.c                     |    6 +-
>  sysdeps/mach/nanosleep.c                      |   33 +-
>  sysdeps/mach/sleep.c                          |    4 +-
>  sysdeps/mach/usleep.c                         |    5 -
>  sysdeps/posix/gettimeofday.c                  |   67 --
>  sysdeps/posix/tempname.c                      |    9 +-
>  sysdeps/posix/time.c                          |   40 -
>  sysdeps/pthread/aio_misc.c                    |    6 +-
>  sysdeps/pthread/aio_suspend.c                 |    6 +-
>  sysdeps/unix/clock_gettime.c                  |   64 -
>  sysdeps/unix/make-syscalls.sh                 |    2 +-
>  sysdeps/unix/syscalls.list                    |    2 -
>  .../unix/sysv/linux/aarch64/gettimeofday.c    |   71 --
>  sysdeps/unix/sysv/linux/aarch64/init-first.c  |    7 +-
>  sysdeps/unix/sysv/linux/aarch64/libc-vdso.h   |    2 -
>  sysdeps/unix/sysv/linux/aarch64/libc.abilist  |    1 -
>  sysdeps/unix/sysv/linux/alpha/Makefile        |    2 +-
>  sysdeps/unix/sysv/linux/alpha/Versions        |    1 -
>  sysdeps/unix/sysv/linux/alpha/adjtime.c       |   70 +-
>  .../linux/{time.c => alpha/gettimeofday.c}    |   31 +-
>  sysdeps/unix/sysv/linux/alpha/libc.abilist    |    2 -
>  sysdeps/unix/sysv/linux/alpha/librt.abilist   |    5 -
>  sysdeps/unix/sysv/linux/alpha/osf_adjtime.c   |  135 +++
>  sysdeps/unix/sysv/linux/alpha/osf_getitimer.c |   48 +
>  sysdeps/unix/sysv/linux/alpha/osf_getrusage.c |   44 +
>  .../unix/sysv/linux/alpha/osf_gettimeofday.c  |   53 +
>  sysdeps/unix/sysv/linux/alpha/osf_setitimer.c |   55 +
>  .../unix/sysv/linux/alpha/osf_settimeofday.c  |   51 +
>  .../ftime.c => sysv/linux/alpha/osf_utimes.c} |   34 +-
>  .../linux/alpha/osf_wait4.c}                  |   51 +-
>  sysdeps/unix/sysv/linux/alpha/settimeofday.c  |   22 +
>  sysdeps/unix/sysv/linux/alpha/syscalls.list   |   13 +-
>  sysdeps/unix/sysv/linux/alpha/tv32-compat.h   |  151 +++
>  sysdeps/unix/sysv/linux/arm/init-first.c      |    7 +-
>  sysdeps/unix/sysv/linux/arm/libc-vdso.h       |    2 -
>  sysdeps/unix/sysv/linux/arm/libc.abilist      |    1 -
>  sysdeps/unix/sysv/linux/arm/librt.abilist     |    5 -
>  sysdeps/unix/sysv/linux/clock_settime.c       |    1 +
>  sysdeps/unix/sysv/linux/csky/libc.abilist     |    1 -
>  sysdeps/unix/sysv/linux/ftime.c               |    3 -
>  sysdeps/unix/sysv/linux/gettimeofday.c        |   39 -
>  sysdeps/unix/sysv/linux/hppa/libc.abilist     |    1 -
>  sysdeps/unix/sysv/linux/hppa/librt.abilist    |    5 -
>  sysdeps/unix/sysv/linux/i386/gettimeofday.c   |   35 -
>  sysdeps/unix/sysv/linux/i386/libc.abilist     |    1 -
>  sysdeps/unix/sysv/linux/i386/librt.abilist    |    5 -
>  sysdeps/unix/sysv/linux/i386/time.c           |   34 -
>  sysdeps/unix/sysv/linux/ia64/libc.abilist     |    1 -
>  sysdeps/unix/sysv/linux/ia64/librt.abilist    |    5 -
>  .../sysv/linux/m68k/coldfire/libc.abilist     |    1 -
>  .../sysv/linux/m68k/coldfire/librt.abilist    |    5 -
>  .../unix/sysv/linux/m68k/m680x0/libc.abilist  |    1 -
>  .../unix/sysv/linux/m68k/m680x0/librt.abilist |    5 -
>  .../unix/sysv/linux/microblaze/libc.abilist   |    1 -
>  .../unix/sysv/linux/microblaze/librt.abilist  |    5 -
>  sysdeps/unix/sysv/linux/mips/init-first.c     |    7 +-
>  sysdeps/unix/sysv/linux/mips/libc-vdso.h      |    2 -
>  .../sysv/linux/mips/mips32/fpu/libc.abilist   |    1 -
>  .../unix/sysv/linux/mips/mips32/librt.abilist |    5 -
>  .../sysv/linux/mips/mips32/nofpu/libc.abilist |    1 -
>  .../unix/sysv/linux/mips/mips64/librt.abilist |    5 -
>  .../sysv/linux/mips/mips64/n32/libc.abilist   |    1 -
>  .../sysv/linux/mips/mips64/n64/libc.abilist   |    1 -
>  sysdeps/unix/sysv/linux/nios2/libc.abilist    |    1 -
>  sysdeps/unix/sysv/linux/powerpc/Versions      |    1 -
>  .../unix/sysv/linux/powerpc/gettimeofday.c    |   85 --
>  sysdeps/unix/sysv/linux/powerpc/init-first.c  |   13 +-
>  sysdeps/unix/sysv/linux/powerpc/libc-vdso.h   |    2 -
>  .../linux/powerpc/powerpc32/fpu/libc.abilist  |    1 -
>  .../linux/powerpc/powerpc32/librt.abilist     |    5 -
>  .../powerpc/powerpc32/nofpu/libc.abilist      |    1 -
>  .../linux/powerpc/powerpc64/be/libc.abilist   |    1 -
>  .../linux/powerpc/powerpc64/be/librt.abilist  |    5 -
>  .../linux/powerpc/powerpc64/le/libc.abilist   |    1 -
>  sysdeps/unix/sysv/linux/powerpc/time.c        |   84 --
>  sysdeps/unix/sysv/linux/riscv/init-first.c    |   10 +-
>  sysdeps/unix/sysv/linux/riscv/libc-vdso.h     |    2 -
>  .../unix/sysv/linux/riscv/rv64/libc.abilist   |    1 -
>  sysdeps/unix/sysv/linux/s390/init-first.c     |    9 +-
>  sysdeps/unix/sysv/linux/s390/libc-vdso.h      |    3 -
>  .../unix/sysv/linux/s390/s390-32/libc.abilist |    1 -
>  .../sysv/linux/s390/s390-32/librt.abilist     |    5 -
>  .../unix/sysv/linux/s390/s390-64/libc.abilist |    1 -
>  .../sysv/linux/s390/s390-64/librt.abilist     |    5 -
>  sysdeps/unix/sysv/linux/settimezone.c         |   39 +
>  sysdeps/unix/sysv/linux/sh/libc.abilist       |    1 -
>  sysdeps/unix/sysv/linux/sh/librt.abilist      |    5 -
>  sysdeps/unix/sysv/linux/sparc/init-first.c    |    8 +-
>  sysdeps/unix/sysv/linux/sparc/libc-vdso.h     |    2 -
>  .../sysv/linux/sparc/sparc32/libc.abilist     |    1 -
>  .../sysv/linux/sparc/sparc32/librt.abilist    |    5 -
>  .../sysv/linux/sparc/sparc64/libc.abilist     |    1 -
>  .../sysv/linux/sparc/sparc64/librt.abilist    |    5 -
>  sysdeps/unix/sysv/linux/sparc/sparc64/time.c  |    1 -
>  sysdeps/unix/sysv/linux/syscalls.list         |    1 -
>  sysdeps/unix/sysv/linux/x86/gettimeofday.c    |   61 -
>  sysdeps/unix/sysv/linux/x86/time.c            |   59 -
>  .../unix/sysv/linux/x86_64/64/libc.abilist    |    1 -
>  .../unix/sysv/linux/x86_64/64/librt.abilist   |    5 -
>  .../unix/sysv/linux/x86_64/x32/libc.abilist   |    1 -
>  .../unix/sysv/linux/x86_64/x32/librt.abilist  |    5 -
>  .../unix/sysv/linux/x86_64/x32/syscalls.list  |    2 -
>  time/Makefile                                 |    8 +-
>  time/Versions                                 |    2 +-
>  {rt => time}/clock_getcpuclockid.c            |    0
>  {rt => time}/clock_getres.c                   |    0
>  {rt => time}/clock_gettime.c                  |    0
>  {rt => time}/clock_nanosleep.c                |    0
>  {rt => time}/clock_settime.c                  |    1 +
>  time/ftime.c                                  |   26 +-
>  time/getdate.c                                |    2 +-
>  time/gettimeofday.c                           |   30 +-
>  time/settimeofday.c                           |   24 +-
>  sysdeps/unix/stime.c => time/settimezone.c    |   23 +-
>  time/stime.c                                  |   15 +-
>  time/sys/time.h                               |   36 +-
>  time/time.c                                   |   17 +-
>  {rt => time}/tst-clock.c                      |    0
>  {rt => time}/tst-clock2.c                     |    0
>  {rt => time}/tst-clock_nanosleep.c            |    0
>  {rt => time}/tst-cpuclock1.c                  |    0
>  time/tst_wcsftime.c                           |    2 +-
>  156 files changed, 1580 insertions(+), 1775 deletions(-)
>  delete mode 100644 rt/clock-compat.c
>  rename sysdeps/mach/{gettimeofday.c => clock_gettime.c} (67%)
>  rename sysdeps/mach/hurd/{settimeofday.c => clock_settime.c} (71%)
>  delete mode 100644 sysdeps/posix/gettimeofday.c
>  delete mode 100644 sysdeps/posix/time.c
>  delete mode 100644 sysdeps/unix/clock_gettime.c
>  delete mode 100644 sysdeps/unix/sysv/linux/aarch64/gettimeofday.c
>  rename sysdeps/unix/sysv/linux/{time.c => alpha/gettimeofday.c} (64%)
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_adjtime.c
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_getitimer.c
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_getrusage.c
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_setitimer.c
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_settimeofday.c
>  rename sysdeps/unix/{bsd/ftime.c => sysv/linux/alpha/osf_utimes.c} (60%)
>  rename sysdeps/unix/{clock_settime.c => sysv/linux/alpha/osf_wait4.c} (55%)
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/settimeofday.c
>  create mode 100644 sysdeps/unix/sysv/linux/alpha/tv32-compat.h
>  delete mode 100644 sysdeps/unix/sysv/linux/ftime.c
>  delete mode 100644 sysdeps/unix/sysv/linux/gettimeofday.c
>  delete mode 100644 sysdeps/unix/sysv/linux/i386/gettimeofday.c
>  delete mode 100644 sysdeps/unix/sysv/linux/i386/time.c
>  delete mode 100644 sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
>  delete mode 100644 sysdeps/unix/sysv/linux/powerpc/time.c
>  create mode 100644 sysdeps/unix/sysv/linux/settimezone.c
>  delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/time.c
>  delete mode 100644 sysdeps/unix/sysv/linux/x86/gettimeofday.c
>  delete mode 100644 sysdeps/unix/sysv/linux/x86/time.c
>  rename {rt => time}/clock_getcpuclockid.c (100%)
>  rename {rt => time}/clock_getres.c (100%)
>  rename {rt => time}/clock_gettime.c (100%)
>  rename {rt => time}/clock_nanosleep.c (100%)
>  rename {rt => time}/clock_settime.c (96%)
>  rename sysdeps/unix/stime.c => time/settimezone.c (67%)
>  rename {rt => time}/tst-clock.c (100%)
>  rename {rt => time}/tst-clock2.c (100%)
>  rename {rt => time}/tst-clock_nanosleep.c (100%)
>  rename {rt => time}/tst-cpuclock1.c (100%)
>
> --
> 2.23.0.rc1
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]