summaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
authorglewis <glewis@FreeBSD.org>2006-10-08 19:14:41 +0000
committerglewis <glewis@FreeBSD.org>2006-10-08 19:14:41 +0000
commit91440f5023d10692eaab69a5bb9426acd95cfa0d (patch)
treea0f87e47cf755b91d644408c7bc7cf3790ebb762 /java
parenta42608c155251c6d34f16bb06904a12db4b926c7 (diff)
downloadFreeBSD-ports-91440f5023d10692eaab69a5bb9426acd95cfa0d.zip
FreeBSD-ports-91440f5023d10692eaab69a5bb9426acd95cfa0d.tar.gz
. Use a mutex to make the resolver functions thread safe on FreeBSD 4.x
(they are already thread safe on FreeBSD 5+). Submitted by: Arne Juul <arnej@europe.yahoo-inc.com>
Diffstat (limited to 'java')
-rw-r--r--java/jdk14/files/patch-j2se::net::Inet4AddressImpl.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/java/jdk14/files/patch-j2se::net::Inet4AddressImpl.c b/java/jdk14/files/patch-j2se::net::Inet4AddressImpl.c
new file mode 100644
index 0000000..e51ce92
--- /dev/null
+++ b/java/jdk14/files/patch-j2se::net::Inet4AddressImpl.c
@@ -0,0 +1,110 @@
+$FreeBSD$
+
+--- ../../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) {
+ /*
+@@ -428,7 +461,9 @@
+ #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
+
+ /* 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");
OpenPOWER on IntegriCloud