This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
reentr.[ch]: Add gmtime_r, localtime_r
authorKarl Williamson <khw@cpan.org>
Sun, 15 Mar 2020 20:18:53 +0000 (14:18 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 19 Mar 2020 00:05:49 +0000 (18:05 -0600)
This now replaces occurrences of the non re-entrant versions of these
two functions  with the reentrant ones.

reentr.c
reentr.h
regen/reentr.pl

index 5ef55c0..8ddda7b 100644 (file)
--- a/reentr.c
+++ b/reentr.c
@@ -132,6 +132,12 @@ Perl_reentrant_size(pTHX) {
 #    endif
 #  endif /* HAS_GETSPNAM_R */
 
+#  ifdef HAS_GMTIME_R
+#  endif /* HAS_GMTIME_R */
+
+#  ifdef HAS_LOCALTIME_R
+#  endif /* HAS_LOCALTIME_R */
+
 #  ifdef HAS_READDIR_R
        /* This is the size Solaris recommends.
         * (though we go static, should use pathconf() instead) */
@@ -235,6 +241,12 @@ Perl_reentrant_init(pTHX) {
        Newx(PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size, char);
 #  endif /* HAS_GETSPNAM_R */
 
+#  ifdef HAS_GMTIME_R
+#  endif /* HAS_GMTIME_R */
+
+#  ifdef HAS_LOCALTIME_R
+#  endif /* HAS_LOCALTIME_R */
+
 #  ifdef HAS_READDIR_R
        PL_reentrant_buffer->_readdir_struct = (struct dirent*)safemalloc(PL_reentrant_buffer->_readdir_size);
 #  endif /* HAS_READDIR_R */
@@ -322,6 +334,12 @@ Perl_reentrant_free(pTHX) {
        Safefree(PL_reentrant_buffer->_spent_buffer);
 #  endif /* HAS_GETSPNAM_R */
 
+#  ifdef HAS_GMTIME_R
+#  endif /* HAS_GMTIME_R */
+
+#  ifdef HAS_LOCALTIME_R
+#  endif /* HAS_LOCALTIME_R */
+
 #  ifdef HAS_READDIR_R
        Safefree(PL_reentrant_buffer->_readdir_struct);
 #  endif /* HAS_READDIR_R */
index b3c3c03..cf41900 100644 (file)
--- a/reentr.h
+++ b/reentr.h
 #  define REENTRANT_PROTO_S_SBIE       64
 #  define REENTRANT_PROTO_S_SBW        65
 #  define REENTRANT_PROTO_S_TISBI      66
-#  define REENTRANT_PROTO_S_TSBI       67
-#  define REENTRANT_PROTO_S_TSBIE      68
-#  define REENTRANT_PROTO_S_TWISBIE    69
-#  define REENTRANT_PROTO_V_D  70
-#  define REENTRANT_PROTO_V_H  71
-#  define REENTRANT_PROTO_V_ID 72
+#  define REENTRANT_PROTO_S_TS 67
+#  define REENTRANT_PROTO_S_TSBI       68
+#  define REENTRANT_PROTO_S_TSBIE      69
+#  define REENTRANT_PROTO_S_TWISBIE    70
+#  define REENTRANT_PROTO_V_D  71
+#  define REENTRANT_PROTO_V_H  72
+#  define REENTRANT_PROTO_V_ID 73
 
 /* Defines for indicating which special features are supported. */
 
@@ -768,6 +769,14 @@ typedef struct {
 #   endif
 #  endif /* HAS_GETSPNAM_R */
 
+#  ifdef HAS_GMTIME_R
+       struct tm _gmtime_struct;
+#  endif /* HAS_GMTIME_R */
+
+#  ifdef HAS_LOCALTIME_R
+       struct tm _localtime_struct;
+#  endif /* HAS_LOCALTIME_R */
+
 #  ifdef HAS_READDIR_R
        struct dirent*  _readdir_struct;
        size_t  _readdir_size;
@@ -1453,6 +1462,32 @@ typedef struct {
 #  endif /* HAS_GETSPNAM_R */
 
 
+#  ifdef HAS_GMTIME_R
+#    if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+#      undef gmtime
+#      if !defined(gmtime) && GMTIME_R_PROTO == REENTRANT_PROTO_S_TS
+#        define gmtime(a) (gmtime_r(a, &PL_reentrant_buffer->_gmtime_struct) ? &PL_reentrant_buffer->_gmtime_struct : 0)
+#      endif
+#      if defined(gmtime)
+#        define PERL_REENTR_USING_GMTIME_R
+#      endif
+#    endif
+#  endif /* HAS_GMTIME_R */
+
+
+#  ifdef HAS_LOCALTIME_R
+#    if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+#      undef localtime
+#      if !defined(localtime) && LOCALTIME_R_PROTO == REENTRANT_PROTO_S_TS
+#        define localtime(a) (L_R_TZSET localtime_r(a, &PL_reentrant_buffer->_localtime_struct) ? &PL_reentrant_buffer->_localtime_struct : 0)
+#      endif
+#      if defined(localtime)
+#        define PERL_REENTR_USING_LOCALTIME_R
+#      endif
+#    endif
+#  endif /* HAS_LOCALTIME_R */
+
+
 #  ifdef HAS_READDIR_R
 #    if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
 #      undef readdir
index 2604d2c..fa961d5 100644 (file)
@@ -495,6 +495,13 @@ EOF
            pushinitfree $func;
            pushssif $endif;
        }
+       elsif ($func =~ /^(gm|local)time$/) {
+           pushssif $ifdef;
+           push @struct, <<EOF;    # Fixed size
+       $seent{$func} _${func}_struct;
+EOF
+           pushssif $endif;
+       }
         elsif ($func =~ /^(crypt)$/) {
            pushssif $ifdef;
            push @struct, <<EOF;
@@ -689,7 +696,10 @@ EOF
                $w = ", $w" if length $v;
            }
 
-           my $call = "${func}_r($v$w)";
+            # This needs a special case, see its definition in config.h
+            my $setup = ($func eq 'localtime') ? "L_R_TZSET " : "";
+
+           my $call = "$setup${func}_r($v$w)";
 
             # Must make OpenBSD happy
             my $memzero = '';
@@ -1197,6 +1207,8 @@ getservbyname CC|netdb    |struct servent |I_CCSBWR|S_CCSBI|I_CCSD|D=struct servent
 getservbyport IC|netdb |struct servent |I_ICSBWR|S_ICSBI|I_ICSD|D=struct servent_data*
 getservent     |netdb  |struct servent |I_SBWR|I_SBI|S_SBI|I_SD|D=struct servent_data*
 getspnam C     |shadow |struct spwd    |I_CSBWR|S_CSBI
+gmtime T       |time   |struct tm      |S_TS|T=time_t*
+localtime T    |time   |struct tm      |S_TS|T=time_t*
 readdir T      |dirent |struct dirent  |I_TSR|I_TS|T=DIR*
 readdir64 T    |dirent |struct dirent64|I_TSR|I_TS|T=DIR*
 setgrent       |grp    |               |I_H|V_H