Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Jul 2006 05:38:55 -0700 (PDT)
From:      Arne Juul <arnej@europe.yahoo-inc.com>
To:        Landon Fuller <landonf@opendarwin.org>
Cc:        java@freebsd.org
Subject:   Re: non-threadsafe InetAddress.getHostName()
Message-ID:  <20060710053458.F37375@dev-arnej.trondheim.corp.yahoo.com>
In-Reply-To: <6E6948AF-73E6-4CFE-AA43-CD3508C009AA@opendarwin.org>
References:  <20060626172546.P80831@dev-arnej.trondheim.corp.yahoo.com> <6E6948AF-73E6-4CFE-AA43-CD3508C009AA@opendarwin.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 30 Jun 2006, Landon Fuller wrote:
> On Jun 26, 2006, at 17:38, Arne Juul wrote:
>
> > This happens on FreeBSD with jdk 1.4.2p8_2 at least.
> What release of FreeBSD?

It only happens when compiling on FreeBSD 4 (and probably
non-FreeBSD builds).

Now I've found that the JDK 1.5 patches already had this fixed,
and the following backport patch fixes it for 1.4.2 as well.
I guess this means the first XXXBSD comment can be removed,
the mutex does work "as expected" :-)


--- ../../j2se/src/solaris/native/java/net/Inet4AddressImpl.c.old	Tue Jun 27 02:55:32 2006
+++ ../../j2se/src/solaris/native/java/net/Inet4AddressImpl.c	Tue Jun 27 02:55:35 2006
@@ -13,6 +13,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>
+#include <pthread.h>
 #if defined(_ALLBSD_SOURCE)
 #include <unistd.h>
 #if defined(__FreeBSD__) && __FreeBSD__ > 4
@@ -312,6 +313,34 @@
                 struct hostent *hptr,
                 HOST_R_ARGS);

+/*
+ * BSDNOTE: Since we are emulating thread-safe functions, we need to
+ * ensure they're not running in parallel.  So, setup mutexes
+ *
+ * XXXBSD: make sure it works as expected
+ * XXXBSD: move initialization to somethere earlier
+ */
+
+pthread_mutex_t _net_mutex = PTHREAD_MUTEX_INITIALIZER;
+static int _net_mutex_inited = 0;
+
+static int
+_acquire_net_mutex()
+{
+	if (_net_mutex_inited == 0) {
+		if (pthread_mutex_init(&_net_mutex, NULL))
+			return (EINVAL);
+		_net_mutex_inited = 1;
+	}
+	return (pthread_mutex_lock(&_net_mutex));
+}
+
+static int
+_release_net_mutex()
+{
+	return (pthread_mutex_unlock(&_net_mutex));
+}
+
 #endif

 /************************************************************************
@@ -355,15 +384,19 @@
 #ifdef __GLIBC__
 	gethostbyname_r(hostname, &res, buf, sizeof(buf), &hp, &h_error);
 #else
+	_acquire_net_mutex();
 	hp = JDK_gethostbyname_r(hostname, &res, buf, sizeof(buf), &h_error);
+	_release_net_mutex();
 #endif
 	if (hp) {
 #ifdef __GLIBC__
 	    gethostbyaddr_r(hp->h_addr, hp->h_length, AF_INET,
 			    &res2, buf2, sizeof(buf2), &hp, &h_error);
 #else
+	    _acquire_net_mutex();
 	    hp = JDK_gethostbyaddr_r(hp->h_addr, hp->h_length, AF_INET,
 				 &res2, buf2, sizeof(buf2), &h_error);
+	    _release_net_mutex();
 #endif
 	    if (hp) {
 		/*
@@ -427,8 +460,10 @@
     /* Try once, with our static buffer. */
 #ifdef __GLIBC__
     gethostbyname_r(hostname, &res, buf, sizeof(buf), &hp, &h_error);
-#else
+#else
+    _acquire_net_mutex();
     hp = JDK_gethostbyname_r(hostname, &res, buf, sizeof(buf), &h_error);
+    _release_net_mutex();
 #endif

     /* With the re-entrant system calls, it's possible that the buffer
@@ -442,8 +477,10 @@
 	    gethostbyname_r(hostname, &res, tmp, BIG_HENT_BUF_SIZE,
 			    &hp, &h_error);
 #else
+	    _acquire_net_mutex();
 	    hp = JDK_gethostbyname_r(hostname, &res, tmp, BIG_HENT_BUF_SIZE,
 				 &h_error);
+	    _release_net_mutex();
 #endif
 	}
     }
@@ -531,8 +568,10 @@
     gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, &hent,
 		    buf, sizeof(buf), &hp, &h_error);
 #else
+    _acquire_net_mutex();
     hp = JDK_gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET, &hent,
 			 buf, sizeof(buf), &h_error);
+    _release_net_mutex();
 #endif
     /* With the re-entrant system calls, it's possible that the buffer
      * we pass to it is not large enough to hold an exceptionally
@@ -545,8 +584,10 @@
 	    gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET,
 			    &hent, tmp, BIG_HENT_BUF_SIZE, &hp, &h_error);
 #else
+	    _acquire_net_mutex();
 	    hp = JDK_gethostbyaddr_r((char *)&addr, sizeof(addr), AF_INET,
 				 &hent, tmp, BIG_HENT_BUF_SIZE, &h_error);
+	    _release_net_mutex();
 #endif
 	} else {
 	    JNU_ThrowOutOfMemoryError(env, "getHostByAddr");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060710053458.F37375>