# and optionally also the relevant metaconfig units (-U option).
#
+BEGIN {
+ # Get function prototypes
+ require 'regen_lib.pl';
+}
+
use strict;
use Getopt::Std;
my %opts;
# Example #3: S_CBI means type func_r(const char*, char*, int)
+safer_unlink 'reentr.h';
die "reentr.h: $!" unless open(H, ">reentr.h");
+binmode H;
select H;
print <<EOF;
/* -*- buffer-read-only: t -*-
*
* reentr.h
*
- * Copyright (C) 2002, 2003, 2005 by Larry Wall and others
+ * Copyright (C) 2002, 2003, 2005, 2006, 2007 by Larry Wall and others
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
#ifndef REENTR_H
#define REENTR_H
+/* 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>.
+ */
+
+#ifndef PERL_REENTR_API
+# if defined(PERL_CORE) || defined(PERL_EXT)
+# define PERL_REENTR_API 1
+# else
+# define PERL_REENTR_API 0
+# endif
+#endif
+
#ifdef USE_REENTRANT_API
/* Deprecations: some platforms have the said reentrant interfaces
* but they are declared obsolete and are not to be used. Often this
* means that the platform has threadsafed the interfaces (hopefully).
* All this is OS version dependent, so we are of course fooling ourselves.
- * If you know of more deprecations on some platforms, please add your own. */
+ * If you know of more deprecations on some platforms, please add your own
+ * (by editing reentr.pl, mind!) */
#ifdef __hpux
# undef HAS_CRYPT_R
* memzero out certain structures before calling the functions.
*/
#if defined(__OpenBSD__)
-# define REENTR_MEMZERO(a,b) memzero(a,b),
+# define REENTR_MEMZERO(a,b) memzero(a,b)
#else
-# define REENTR_MEMZERO(a,b)
+# define REENTR_MEMZERO(a,b) 0
#endif
#ifdef NETDB_R_OBSOLETE
# If given the -U option open up the metaconfig unit for this function.
if ($opts{U} && open(U, ">d_${func}_r.U")) {
+ binmode U;
select U;
}
sub pushinitfree {
my $func = shift;
push @init, <<EOF;
- New(31338, PL_reentrant_buffer->_${func}_buffer, PL_reentrant_buffer->_${func}_size, char);
+ Newx(PL_reentrant_buffer->_${func}_buffer, PL_reentrant_buffer->_${func}_size, char);
EOF
push @free, <<EOF;
Safefree(PL_reentrant_buffer->_${func}_buffer);
push @size, <<EOF;
# if defined(HAS_SYSCONF) && defined($sc) && !defined(__GLIBC__)
PL_reentrant_buffer->$sz = sysconf($sc);
- if (PL_reentrant_buffer->$sz == -1)
+ if (PL_reentrant_buffer->$sz == (size_t) -1)
PL_reentrant_buffer->$sz = REENTRANTUSUALSIZE;
# else
# if defined(__osf__) && defined(__alpha) && defined(SIABUFSIZ)
EOF
push @init, <<EOF;
#if !($D)
- New(31338, PL_reentrant_buffer->_${genfunc}_buffer, PL_reentrant_buffer->_${genfunc}_size, char);
+ Newx(PL_reentrant_buffer->_${genfunc}_buffer, PL_reentrant_buffer->_${genfunc}_size, char);
#endif
EOF
push @free, <<EOF;
push @wrap, $ifdef;
push @wrap, <<EOF;
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
# undef $func
EOF
} split '', $b;
$w = ", $w" if length $v;
}
+
my $call = "${func}_r($v$w)";
+ if ($func eq 'localtime') {
+ $call = "L_R_TZSET $call";
+ }
# Must make OpenBSD happy
my $memzero = '';
if($p =~ /D$/ &&
($genfunc eq 'protoent' || $genfunc eq 'servent')) {
- $memzero = 'REENTR_MEMZERO(&PL_reentrant_buffer->_' . $genfunc . '_data, sizeof(PL_reentrant_buffer->_' . $genfunc . '_data))';
+ $memzero = 'REENTR_MEMZERO(&PL_reentrant_buffer->_' . $genfunc . '_data, sizeof(PL_reentrant_buffer->_' . $genfunc . '_data)),';
}
push @wrap, <<EOF;
# if !defined($func) && ${FUNC}_R_PROTO == REENTRANT_PROTO_$p
my $rv = $v ? ", $v" : "";
if ($r eq 'I') {
push @wrap, <<EOF;
-# define $func($v) ($memzero(PL_reentrant_retint = $call)$test ? $true : (((PL_reentrant_retint == ERANGE) || (errno == ERANGE)) ? ($seent{$func} *) Perl_reentrant_retry("$func"$rv) : 0))
+# define $func($v) ($memzero(PL_reentrant_retint = $call)$test ? $true : ((PL_reentrant_retint == ERANGE) ? ($seent{$func} *) Perl_reentrant_retry("$func"$rv) : 0))
EOF
} else {
push @wrap, <<EOF;
}
}
push @wrap, <<EOF;
-# endif
+# endif /* if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1) */
EOF
}
+ push @wrap, <<EOF;
+# endif /* HAS_\U$func */
+EOF
+
push @wrap, $endif, "\n";
}
}
# Prepare to write the reentr.c.
+safer_unlink 'reentr.c';
die "reentr.c: $!" unless open(C, ">reentr.c");
+binmode C;
select C;
print <<EOF;
/* -*- buffer-read-only: t -*-
*
* reentr.c
*
- * Copyright (C) 2002, 2003, 2005 by Larry Wall and others
+ * Copyright (C) 2002, 2003, 2005, 2006, 2007 by Larry Wall and others
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
void
Perl_reentrant_init(pTHX) {
#ifdef USE_REENTRANT_API
- New(31337, PL_reentrant_buffer, 1, REENTR);
+ Newx(PL_reentrant_buffer, 1, REENTR);
Perl_reentrant_size(aTHX);
@init
#endif /* USE_REENTRANT_API */
}
va_end(ap);
+#else
+ PERL_UNUSED_ARG(f);
#endif
return retptr;
}