summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvasiljevic <zv@archiware.com>2006-09-08 20:57:18 (GMT)
committervasiljevic <zv@archiware.com>2006-09-08 20:57:18 (GMT)
commit22f04a9312703adbda93e367fc6af2064f1b14a3 (patch)
tree78f1996f41d82db81327beba3a896c4676db02c6
parent4fb991a000060da5d543e5b9408e22a85e8559b0 (diff)
downloadtcl-22f04a9312703adbda93e367fc6af2064f1b14a3.zip
tcl-22f04a9312703adbda93e367fc6af2064f1b14a3.tar.gz
tcl-22f04a9312703adbda93e367fc6af2064f1b14a3.tar.bz2
Added special handling for Darwin where gethostbyname/addr are actually
MT-safe per-se.
-rw-r--r--ChangeLog11
-rwxr-xr-xunix/configure19
-rw-r--r--unix/configure.in15
-rw-r--r--unix/tclUnixCompat.c23
4 files changed, 53 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index abe395b..dbccde9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2006-09-08 Zoran Vasiljevic <vasiljevic@users.sourceforge.net>
+
+ * unix/tclUnixCompat.c: Added fallback to gethostbyname()
+ and gethostbyaddr() if the implementation is known to be
+ MT-safe (currently for Darwin 6 or later only).
+
+ * unix/configure.in: Assume gethostbyname() and gethostbyaddr()
+ are MT-safe starting with Darwin 6 (Mac OSX 10.2).
+
+ * unix/configure: Regenerated with autoconf V2.59
+
2006-09-08 Andreas Kupries <andreask@activestate.com>
* unix/tclUnixCompat.c: Fixed conditions for CopyArray/CopyString,
diff --git a/unix/configure b/unix/configure
index bf0d085..a4a658c 100755
--- a/unix/configure
+++ b/unix/configure
@@ -10778,7 +10778,21 @@ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
- echo "$as_me:$LINENO: checking for gethostbyname_r" >&5
+ if test "`uname -s`" = "Darwin" && \
+ test "`uname -r | awk -F. '{print $1}'`" -gt 5; then
+ # Starting with Darwin 6 (Mac OSX 10.2), gethostbyX
+ # are actually MT-safe as they always return pointers
+ # from the TSD instead of the static storage.
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_MTSAFE_GETHOSTBYNAME 1
+_ACEOF
+
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_MTSAFE_GETHOSTBYADDR 1
+_ACEOF
+
+ else
+ echo "$as_me:$LINENO: checking for gethostbyname_r" >&5
echo $ECHO_N "checking for gethostbyname_r... $ECHO_C" >&6
if test "${ac_cv_func_gethostbyname_r+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11091,7 +11105,7 @@ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
- echo "$as_me:$LINENO: checking for gethostbyaddr_r" >&5
+ echo "$as_me:$LINENO: checking for gethostbyaddr_r" >&5
echo $ECHO_N "checking for gethostbyaddr_r... $ECHO_C" >&6
if test "${ac_cv_func_gethostbyaddr_r+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -11340,6 +11354,7 @@ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
+ fi
fi
#---------------------------------------------------------------------------
diff --git a/unix/configure.in b/unix/configure.in
index 8e248e9..16cf959 100644
--- a/unix/configure.in
+++ b/unix/configure.in
@@ -3,7 +3,7 @@ dnl This file is an input file used by the GNU "autoconf" program to
dnl generate the file "configure", which is run during Tcl installation
dnl to configure the system for the local environment.
#
-# RCS: @(#) $Id: configure.in,v 1.145 2006/09/06 13:23:37 vasiljevic Exp $
+# RCS: @(#) $Id: configure.in,v 1.146 2006/09/08 20:57:19 vasiljevic Exp $
AC_INIT([tcl],[8.5])
AC_PREREQ(2.59)
@@ -171,8 +171,17 @@ if test "${TCL_THREADS}" = 1; then
SC_TCL_GETPWNAM_R
SC_TCL_GETGRGID_R
SC_TCL_GETGRNAM_R
- SC_TCL_GETHOSTBYNAME_R
- SC_TCL_GETHOSTBYADDR_R
+ if test "`uname -s`" = "Darwin" && \
+ test "`uname -r | awk -F. '{print [$]1}'`" -gt 5; then
+ # Starting with Darwin 6 (Mac OSX 10.2), gethostbyX
+ # are actually MT-safe as they always return pointers
+ # from the TSD instead of the static storage.
+ AC_DEFINE(HAVE_MTSAFE_GETHOSTBYNAME)
+ AC_DEFINE(HAVE_MTSAFE_GETHOSTBYADDR)
+ else
+ SC_TCL_GETHOSTBYNAME_R
+ SC_TCL_GETHOSTBYADDR_R
+ fi
fi
#---------------------------------------------------------------------------
diff --git a/unix/tclUnixCompat.c b/unix/tclUnixCompat.c
index c2ed2ed..e34405e 100644
--- a/unix/tclUnixCompat.c
+++ b/unix/tclUnixCompat.c
@@ -6,7 +6,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclUnixCompat.c,v 1.5 2006/09/08 19:24:32 andreas_kupries Exp $
+ * RCS: @(#) $Id: tclUnixCompat.c,v 1.6 2006/09/08 20:57:19 vasiljevic Exp $
*
*/
@@ -57,8 +57,9 @@ static Tcl_ThreadDataKey dataKey;
Tcl_Mutex compatLock;
-#if (!defined(HAVE_GETHOSTBYNAME_R) || !defined(HAVE_GETHOSTBYADDR_R)) || \
- (!defined(HAVE_GETPWUID_R) || !defined(HAVE_GETGRGID_R))
+#if (!defined(HAVE_GETHOSTBYNAME_R) || !defined(HAVE_GETHOSTBYADDR_R) || \
+ !defined(HAVE_GETPWUID_R) || !defined(HAVE_GETGRGID_R)) && \
+ (!defined(HAVE_MTSAFE_GETHOSTBYNAME) || !defined(HAVE_MTSAFE_GETHOSTBYADDR))
/*
@@ -152,11 +153,12 @@ CopyString(char *src, char *buf, int buflen)
return len;
}
-#endif /* !defined(HAVE_GETHOSTBYNAME_R) && !defined(HAVE_GETHOSTBYADDR_R) && \
- !defined(HAVE_GETPWUID_R) && !defined(HAVE_GETGRGID_R) */
+#endif /* (!defined(HAVE_GETHOSTBYNAME_R) || !defined(HAVE_GETHOSTBYADDR_R) || \
+ !defined(HAVE_GETPWUID_R) || !defined(HAVE_GETGRGID_R)) && \
+ (!defined(HAVE_MTSAFE_GETHOSTBYNAME) || !defined(HAVE_MTSAFE_GETHOSTBYADDR)) */
-
-#if !defined(HAVE_GETHOSTBYNAME_R) || !defined(HAVE_GETHOSTBYADDR_R)
+#if (!defined(HAVE_GETHOSTBYNAME_R) || !defined(HAVE_GETHOSTBYADDR_R)) && \
+ (!defined(HAVE_MTSAFE_GETHOSTBYNAME) || !defined(HAVE_MTSAFE_GETHOSTBYADDR))
/*
*---------------------------------------------------------------------------
@@ -209,7 +211,8 @@ CopyHostent(struct hostent *tgtPtr, char *buf, int buflen)
return 0;
}
-#endif /* !defined(HAVE_GETHOSTBYNAME_R) && !defined(HAVE_GETHOSTBYADDR_R) */
+#endif /* (!defined(HAVE_GETHOSTBYNAME_R) || !defined(HAVE_GETHOSTBYADDR_R)) && \
+ (!defined(HAVE_MTSAFE_GETHOSTBYNAME) || !defined(HAVE_MTSAFE_GETHOSTBYADDR)) */
#if !defined(HAVE_GETPWUID_R)
@@ -561,7 +564,7 @@ TclpGetGrGid(gid_t gid)
struct hostent *
TclpGetHostByName(const char *name)
{
-#if !defined(TCL_THREADS)
+#if !defined(TCL_THREADS) || defined(HAVE_MTSAFE_GETHOSTBYNAME)
return gethostbyname(name);
#else
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
@@ -622,7 +625,7 @@ TclpGetHostByName(const char *name)
struct hostent *
TclpGetHostByAddr(const char *addr, int length, int type)
{
-#if !defined(TCL_THREADS)
+#if !defined(TCL_THREADS) || defined(HAVE_MTSAFE_GETHOSTBYADDR)
return gethostbyaddr(addr, length, type);
#else
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);