summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorGreg Lewis <glewis@FreeBSD.org>2013-01-29 05:06:46 +0000
committerGreg Lewis <glewis@FreeBSD.org>2013-01-29 05:06:46 +0000
commite2304463d37dbaf3ef6b1eb9b88490e1c96b9eaf (patch)
tree0d4441afb26f845ee743a9fb76324560c3a2d96f /java
parent- Update to version 0.4.1 [*] (diff)
. Fix a crash under heavy network load by reverting to using poll(2) rather
than select(2). PR: 175417 Based on the patch by: Phil Phillips <pphillips@experts-exchange.com>
Notes
Notes: svn path=/head/; revision=311149
Diffstat (limited to 'java')
-rw-r--r--java/openjdk7/Makefile1
-rw-r--r--java/openjdk7/files/patch-bsd_close.c85
2 files changed, 86 insertions, 0 deletions
diff --git a/java/openjdk7/Makefile b/java/openjdk7/Makefile
index ac381bea165d..1cc39fa5d116 100644
--- a/java/openjdk7/Makefile
+++ b/java/openjdk7/Makefile
@@ -7,6 +7,7 @@
PORTNAME= openjdk
PORTVERSION= ${JDK_MAJOR_VERSION}.${PORT_MINOR_VERSION}.${PORT_BUILD_NUMBER}
+PORTREVISION= 1
CATEGORIES= java devel
MASTER_SITES= http://download.java.net/openjdk/jdk${JDK_MAJOR_VERSION}u${JDK_MINOR_VERSION}/promoted/b${JDK_BUILD_NUMBER}/ \
http://download.java.net/jaxp/1.4.5/:jaxp \
diff --git a/java/openjdk7/files/patch-bsd_close.c b/java/openjdk7/files/patch-bsd_close.c
new file mode 100644
index 000000000000..8edb10f6d2f8
--- /dev/null
+++ b/java/openjdk7/files/patch-bsd_close.c
@@ -0,0 +1,85 @@
+--- jdk/src/solaris/native/java/net/bsd_close.c Wed Jan 16 16:04:50 2013 -0800
++++ jdk/src/solaris/native/java/net/bsd_close.c Thu Jan 17 22:14:02 2013 -0800
+@@ -345,6 +345,76 @@
+ * signal other than our wakeup signal.
+ */
+ int NET_Timeout(int s, long timeout) {
++/*
++ * On MacOS X, poll(2) is not working correctly, so a select(2) based
++ * implementation is preferred. See
++ *
++ * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7131399
++ *
++ * However, on FreeBSD, the select(2) based implementation can cause
++ * crashes under load and poll(2) is preferred. See
++ *
++ * http://docs.freebsd.org/cgi/getmsg.cgi?fetch=215525+0+current/freebsd-java
++ *
++ * Other *BSD should adjust as appropriate.
++ */
++#ifdef __FreeBSD__
++ long prevtime = 0, newtime;
++ struct timeval t;
++ fdEntry_t *fdEntry = getFdEntry(s);
++
++ /*
++ * Check that fd hasn't been closed.
++ */
++ if (fdEntry == NULL) {
++ errno = EBADF;
++ return -1;
++ }
++
++ /*
++ * Pick up current time as may need to adjust timeout
++ */
++ if (timeout > 0) {
++ gettimeofday(&t, NULL);
++ prevtime = t.tv_sec * 1000 + t.tv_usec / 1000;
++ }
++
++ for(;;) {
++ struct pollfd pfd;
++ int rv;
++ threadEntry_t self;
++
++ /*
++ * Poll the fd. If interrupted by our wakeup signal
++ * errno will be set to EBADF.
++ */
++ pfd.fd = s;
++ pfd.events = POLLIN | POLLERR;
++
++ startOp(fdEntry, &self);
++ rv = poll(&pfd, 1, timeout);
++ endOp(fdEntry, &self);
++
++ /*
++ * If interrupted then adjust timeout. If timeout
++ * has expired return 0 (indicating timeout expired).
++ */
++ if (rv < 0 && errno == EINTR) {
++ if (timeout > 0) {
++ gettimeofday(&t, NULL);
++ newtime = t.tv_sec * 1000 + t.tv_usec / 1000;
++ timeout -= newtime - prevtime;
++ if (timeout <= 0) {
++ return 0;
++ }
++ prevtime = newtime;
++ }
++ } else {
++ return rv;
++ }
++
++ }
++#else
+ long prevtime = 0, newtime;
+ struct timeval t, *tp = &t;
+ fdEntry_t *fdEntry = getFdEntry(s);
+@@ -414,4 +484,5 @@
+ }
+
+ }
++#endif
+ }