Front page | perl.perl5.porters |
Postings from March 2007
Re: [perl #41591] [PATCH] 5.8.8 Handle cases where localtime_r doesnot call tzset
Thread Previous
From:
H.Merijn Brand
Date:
March 9, 2007 10:59
Subject:
Re: [perl #41591] [PATCH] 5.8.8 Handle cases where localtime_r doesnot call tzset
Message ID:
20070309195931.376d1ea7@pc09
On Thu, 22 Feb 2007 15:19:03 -0800, Tom Callaway (via RT)
<perlbug-followup@perl.org> wrote:
> As part of the review process for Perl, I'm opening bugs for the
> long list of patches to perl that Fedora has been carrying around
> (in some cases, for years), in the hopes that these fixes can be
> applied upstream. Unfortunately, I am not the original author of
> these patches, so please be patient with me as I attempt to
> describe why Fedora uses them.
>
> In Fedora, we've found that our multi-threaded perl builds use
> localtime_r which does not call tzset. Thus, this patch, which adds
> a configure check to see if localtime_r calls tzset, and handles
> both the cases in which it does and the cases in which it does not.
I don't exactly know whether this report was the source, but this
change is already in the current development version, entered as:
http://public.activestate.com/cgi-bin/perlbrowse/p/29207
Change 29207 by merijn@merijn-lt09 on 2006/11/06 09:27:56
RE: [perl #26136] localtime(3) calls tzset(3), but localtime_r(3) may not.
From: "Benjamin Holzman" <bholzman@longitude.com>
Date: Wed, 19 Jul 2006 07:11:09 -0400
Message-ID: <010801c6ab24$09b9ed30$ce0515ac@office.iseoptions.com>
Affected files ...
... //depot/metaconfig/U/threads/d_localtime_r.U#20 edit
and shortly followed by
http://public.activestate.com/cgi-bin/perlbrowse/p/29209
Change 29209 by merijn@merijn-lt09 on 2006/11/06 09:43:30
RE: [perl #26136] localtime(3) calls tzset(3), but localtime_r(3) may not.
From: "Benjamin Holzman" <bholzman@longitude.com>
Date: Wed, 19 Jul 2006 07:11:09 -0400
Message-ID: <010801c6ab24$09b9ed30$ce0515ac@office.iseoptions.com>
Affected files ...
... //depot/perl/Configure#627 edit
... //depot/perl/Porting/Glossary#172 edit
... //depot/perl/config_h.SH#324 edit
... //depot/perl/reentr.h#31 edit
... //depot/perl/t/op/time.t#12 edit
BTW, it also looks like this particular patch has already made it to the
maint track, so the upcoming 5.8.9 will also have it
> This was originally filed and discussed here:
> https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=172396
>
> --- perl-5.8.8/config_h.SH.bz172396 2005-10-31 13:13:05.000000000 -0500
> +++ perl-5.8.8/config_h.SH 2006-05-11 16:20:36.000000000 -0400
> @@ -1912,7 +1912,18 @@
> */
> #$d_localtime_r HAS_LOCALTIME_R /**/
> #define LOCALTIME_R_PROTO $localtime_r_proto /**/
> -
> +/* LOCALTIME_R_NEEDS_TZSET :
> + * many libc's localtime_r implementations do not call tzset,
> + * making them differ from localtime(), and making timezone
> + * changes using $ENV{TZ} without explicitly calling tzset
> + * impossible. This symbol makes us call tzset before localtime_r:
> + */
> +#$d_localtime_r_needs_tzset LOCALTIME_R_NEEDS_TZSET /**/
> +#ifdef LOCALTIME_R_NEEDS_TZSET
> +#define L_R_TZSET tzset(),
> +#else
> +#define L_R_TZSET
> +#endif
> /* HAS_LONG_DOUBLE:
> * This symbol will be defined if the C compiler supports long
> * doubles.
> --- perl-5.8.8/reentr.inc.bz172396 2006-05-11 16:20:36.000000000 -0400
> +++ perl-5.8.8/reentr.inc 2006-05-11 16:20:36.000000000 -0400
> @@ -1368,10 +1368,10 @@
> #ifdef HAS_LOCALTIME_R
> # undef localtime
> # if !defined(localtime) && LOCALTIME_R_PROTO == REENTRANT_PROTO_S_TS
> -# define localtime(a) (localtime_r(a,
> &PL_reentrant_buffer->_localtime_struct) ?
> &PL_reentrant_buffer->_localtime_struct : 0)
> +# define localtime(a) ( L_R_TZSET localtime_r(a,
> &PL_reentrant_buffer->_localtime_struct) ?
> &PL_reentrant_buffer->_localtime_struct : 0)
> # endif
> # if !defined(localtime) && LOCALTIME_R_PROTO == REENTRANT_PROTO_I_TS
> -# define localtime(a) (localtime_r(a,
> &PL_reentrant_buffer->_localtime_struct) == 0 ?
> &PL_reentrant_buffer->_localtime_struct : 0)
> +# define localtime(a) ( L_R_TZSET localtime_r(a,
> &PL_reentrant_buffer->_localtime_struct) == 0 ?
> &PL_reentrant_buffer->_localtime_struct : 0)
> # endif
> #endif /* HAS_LOCALTIME_R */
>
> --- perl-5.8.8/Configure.bz172396 2006-05-11 16:20:36.000000000 -0400
> +++ perl-5.8.8/Configure 2006-05-11 16:21:47.000000000 -0400
> @@ -542,6 +542,7 @@
> d_libm_lib_version=''
> d_link=''
> d_localtime_r=''
> +d_localtime_r_needs_tzset=''
> localtime_r_proto=''
> d_locconv=''
> d_lockf=''
> @@ -14261,7 +14262,59 @@
> *) localtime_r_proto=0
> ;;
> esac
> +: see if localtime_r calls tzset
> +case "$localtime_r_proto" in
> +REENTRANT_PROTO*)
> + $cat >try.c <<EOCP
> +/* Does our libc's localtime_r call tzset ?
> + * return 0 if so, 1 otherwise.
> + */
> +#include <sys/types.h>
> +#include <unistd.h>
> +#include <time.h>
> +#include <string.h>
> +#include <malloc.h>
> +int main()
> +{
> + time_t t = time(0L);
> + char w_tz[]="TZ=GMT+5",
> + e_tz[]="TZ=GMT-5",
> + *tz_e = (char*)malloc(16),
> + *tz_w = (char*)malloc(16);
> + struct tm tm_e, tm_w;
> + memset(&tm_e,'\0',sizeof(struct tm));
> + memset(&tm_w,'\0',sizeof(struct tm));
> + strcpy(tz_e,e_tz);
> + strcpy(tz_w,w_tz);
>
> + putenv(tz_e);
> + localtime_r(&t, &tm_e);
> +
> + putenv(tz_w);
> + localtime_r(&t, &tm_w);
> +
> + if( memcmp(&tm_e, &tm_w, sizeof(struct tm)) == 0 )
> + return 1;
> + return 0;
> +}
> +EOCP
> + set try
> + if eval $compile; then
> + if ./try; then
> + d_localtime_r_needs_tzset=undef;
> + else
> + d_localtime_r_needs_tzset=define;
> + fi;
> + rm -f ./try;
> + else
> + d_localtime_r_needs_tzset=undef;
> + fi;
> + rm -f try.c;
> + ;;
> + *)
> + d_localtime_r_needs_tzset=undef;
> + ;;
> +esac
> : see if localeconv exists
> set localeconv d_locconv
> eval $inlibc
> @@ -21220,6 +21273,7 @@
> d_libm_lib_version='$d_libm_lib_version'
> d_link='$d_link'
> d_localtime_r='$d_localtime_r'
> +d_localtime_r_needs_tzset='$d_localtime_r_needs_tzset'
> d_locconv='$d_locconv'
> d_lockf='$d_lockf'
> d_longdbl='$d_longdbl'
--
H.Merijn Brand Amsterdam Perl Mongers (http://amsterdam.pm.org/)
using & porting perl 5.6.2, 5.8.x, 5.9.x on HP-UX 10.20, 11.00, 11.11,
& 11.23, SuSE 10.0 & 10.2, AIX 4.3 & 5.2, and Cygwin. http://qa.perl.org
http://mirrors.develooper.com/hpux/ http://www.test-smoke.org
http://www.goldmark.org/jeff/stupid-disclaimers/
Thread Previous