Browse Source
This allows GDB to use localtime_r unconditionally. See https://lists.gnu.org/archive/html/bug-gnulib/2019-11/msg00022.html for details on the compile error mentioned below. gdb/ChangeLog: 2019-11-15 Christian Biesinger <cbiesinger@google.com> * gdbsupport/common-defs.h: Include time.h before pathmax.h to avoid compile errors. gnulib/ChangeLog: 2019-11-15 Christian Biesinger <cbiesinger@google.com> * Makefile.in: Regenerate. * aclocal.m4: Regenerate. * config.in: Regenerate. * configure: Regenerate. * import/Makefile.am: Update. * import/Makefile.in: Regenerate. * import/m4/gnulib-cache.m4: Update. * import/m4/gnulib-comp.m4: Update. * import/m4/time_r.m4: New file. * import/time_r.c: New file. * update-gnulib.sh: Import time_r. Change-Id: I53fc861b192940d613ca97f2910b4533c730f667gdb-9-branch
14 changed files with 277 additions and 6 deletions
@ -0,0 +1,58 @@ |
|||
dnl Reentrant time functions: localtime_r, gmtime_r. |
|||
|
|||
dnl Copyright (C) 2003, 2006-2016 Free Software Foundation, Inc. |
|||
dnl This file is free software; the Free Software Foundation |
|||
dnl gives unlimited permission to copy and/or distribute it, |
|||
dnl with or without modifications, as long as this notice is preserved. |
|||
|
|||
dnl Written by Paul Eggert. |
|||
|
|||
AC_DEFUN([gl_TIME_R], |
|||
[ |
|||
dnl Persuade glibc and Solaris <time.h> to declare localtime_r. |
|||
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) |
|||
|
|||
AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) |
|||
AC_REQUIRE([AC_C_RESTRICT]) |
|||
|
|||
dnl Some systems don't declare localtime_r() and gmtime_r() if _REENTRANT is |
|||
dnl not defined. |
|||
AC_CHECK_DECLS([localtime_r], [], [], [[#include <time.h>]]) |
|||
if test $ac_cv_have_decl_localtime_r = no; then |
|||
HAVE_DECL_LOCALTIME_R=0 |
|||
fi |
|||
|
|||
AC_CHECK_FUNCS_ONCE([localtime_r]) |
|||
if test $ac_cv_func_localtime_r = yes; then |
|||
HAVE_LOCALTIME_R=1 |
|||
AC_CACHE_CHECK([whether localtime_r is compatible with its POSIX signature], |
|||
[gl_cv_time_r_posix], |
|||
[AC_COMPILE_IFELSE( |
|||
[AC_LANG_PROGRAM( |
|||
[[#include <time.h>]], |
|||
[[/* We don't need to append 'restrict's to the argument types, |
|||
even though the POSIX signature has the 'restrict's, |
|||
since C99 says they can't affect type compatibility. */ |
|||
struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r; |
|||
if (ptr) return 0; |
|||
/* Check the return type is a pointer. |
|||
On HP-UX 10 it is 'int'. */ |
|||
*localtime_r (0, 0);]]) |
|||
], |
|||
[gl_cv_time_r_posix=yes], |
|||
[gl_cv_time_r_posix=no]) |
|||
]) |
|||
if test $gl_cv_time_r_posix = yes; then |
|||
REPLACE_LOCALTIME_R=0 |
|||
else |
|||
REPLACE_LOCALTIME_R=1 |
|||
fi |
|||
else |
|||
HAVE_LOCALTIME_R=0 |
|||
fi |
|||
]) |
|||
|
|||
# Prerequisites of lib/time_r.c. |
|||
AC_DEFUN([gl_PREREQ_TIME_R], [ |
|||
: |
|||
]) |
|||
@ -0,0 +1,44 @@ |
|||
/* Reentrant time functions like localtime_r.
|
|||
|
|||
Copyright (C) 2003, 2006-2007, 2010-2016 Free Software Foundation, Inc. |
|||
|
|||
This program is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 3, or (at your option) |
|||
any later version. |
|||
|
|||
This program is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License along |
|||
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
|||
|
|||
/* Written by Paul Eggert. */ |
|||
|
|||
#include <config.h> |
|||
|
|||
#include <time.h> |
|||
|
|||
static struct tm * |
|||
copy_tm_result (struct tm *dest, struct tm const *src) |
|||
{ |
|||
if (! src) |
|||
return 0; |
|||
*dest = *src; |
|||
return dest; |
|||
} |
|||
|
|||
|
|||
struct tm * |
|||
gmtime_r (time_t const * restrict t, struct tm * restrict tp) |
|||
{ |
|||
return copy_tm_result (tp, gmtime (t)); |
|||
} |
|||
|
|||
struct tm * |
|||
localtime_r (time_t const * restrict t, struct tm * restrict tp) |
|||
{ |
|||
return copy_tm_result (tp, localtime (t)); |
|||
} |
|||
Loading…
Reference in new issue