1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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");
|