develooper 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


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About