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
[perl5.git] / regen / reentr.pl
index 2ca40ea..fa961d5 100644 (file)
@@ -68,8 +68,17 @@ print $h <<EOF;
 /* If compiling for a threaded perl, we will macro-wrap the system/library
  * interfaces (e.g. getpwent()) which have threaded versions
  * (e.g. getpwent_r()), which will handle things correctly for
- * the Perl interpreter, but otherwise (for XS) the wrapping does
- * not take place.  See L<perlxs/Thread-aware system interfaces>.
+ * the Perl interpreter.  This is done automatically for the perl core and
+ * extensions, but not generally for XS modules unless they
+ *    #define PERL_REENTRANT
+ * See L<perlxs/Thread-aware system interfaces>.
+ *
+ * For a function 'foo', use the compile-time directive
+ *    #ifdef PERL_REENTR_USING_FOO_R
+ * to test if the function actually did get replaced by the reentrant version.
+ * (If it isn't getting replaced, it might mean it uses a different prototype
+ * on the given platform than any we are expecting.  To fix that, add the
+ * prototype to the __DATA__ section of regen/reentr.pl.)
  */
 
 #ifndef PERL_REENTR_API
@@ -486,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;
@@ -680,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 = '';
@@ -717,6 +736,11 @@ EOF
 #      endif
 EOF
        }
+                   push @wrap, <<EOF;
+#      if defined($func)
+#        define PERL_REENTR_USING_${FUNC}_R
+#      endif
+EOF
 
            push @wrap, <<EOF;  #  defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
 #    endif
@@ -1183,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