Date: Mon, 11 Dec 2006 17:45:34 +0200 From: Achilleas Mantzios <achill@matrix.gatewaynet.com> To: freebsd-java@freebsd.org Subject: Re: close() of active socket does not work on FreeBSD 6 Message-ID: <200612111745.35227.achill@matrix.gatewaynet.com> In-Reply-To: <Pine.LNX.4.62.0612111552480.16908@decibel.pvv.ntnu.no> References: <Pine.LNX.4.62.0612111535280.32258@decibel.pvv.ntnu.no> <Pine.LNX.4.62.0612111552480.16908@decibel.pvv.ntnu.no>
next in thread | previous in thread | raw e-mail | index | archive | help
=D3=F4=E9=F2 =C4=E5=F5=F4=DD=F1=E1 11 =C4=E5=EA=DD=EC=E2=F1=E9=EF=F2 2006 1= 7:07, =EF/=E7 Arne H. Juul =DD=E3=F1=E1=F8=E5: > On Mon, 11 Dec 2006, Arne H. Juul wrote: > > I've had problems with some tests hanging on FreeBSD 6/amd64. This > > happens both with diablo-1.5.0_07-b01 and the java/jdk15 compiled from > > ports. > > > > After much digging we've determined that the root cause is that > > the guarantee in the socket.close() API, see the documentation at > > http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#close() > > isn't fulfulled - the thread blocked in I/O on the socket doesn't wake > > up. > > Looking at the Java VM source code it does some tricks with dup2() to > reopen the close()'d filedescriptor, making it point to a filedescriptor > that's pre-connected to a closed socket. > > A small C program that duplicates this (using pipes to make it a bit > simpler) follows. I'm not sure if any standards demand that this > works like it used to on FreeBSD 4 / libc_r, but since Java uses it it > would be really nice if this could be made to work in FreeBSD 6 (libthr > and libpthread). Or maybe somebody has another suggestions on how to > implement the Java close() semantics? > I forgot to mention that all my tests were on 386. (So most probably it's n= ot=20 amd64 related). And indeed in FreeBSD 6, by mapping libpthread.so.2 to libc_r.so.6 =46ooConn seems to work correctly. Only with libthr.so.2 / libpthread.so.2 the problem exists. > Anyway, the following C program works as intended on FreeBSD 4, > hangs on FreeBSD 6 (amd64), compiled with: > cc -Wall -pthread read_dup2.c -o read_dup2 > > > #include <fcntl.h> > #include <stdlib.h> > #include <stdio.h> > #include <unistd.h> > #include <pthread.h> > > int p[2]; > > void *run(void *arg) { > ssize_t res; > char tmp[128]; > fprintf(stderr, "reading...\n"); > res =3D read(p[0], tmp, sizeof(tmp)); > fprintf(stderr, "read result: %d\n", (int)res); > if (res < 0) { > perror("read"); > } > return arg; > } > > int main(int argc, char **argv) { > pthread_t t; > int d =3D open("/dev/null", O_RDONLY); > if (pipe(p) !=3D 0) { > perror("pipe"); > return 1; > } > if (pthread_create(&t, NULL, run, NULL) !=3D 0) { > perror("thread create"); > return 1; > } > sleep(1); > d =3D open("/dev/null", O_RDONLY); > if (d < 0) { > perror("open dev null"); > exit(1); > } > if (dup2(d, p[0]) < 0) { > perror("dup2"); > exit(1); > } > if (pthread_join(t, NULL) !=3D 0) { > perror("thread join"); > exit(1); > } > return 0; > } > _______________________________________________ > freebsd-java@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-java > To unsubscribe, send any mail to "freebsd-java-unsubscribe@freebsd.org" =2D-=20 Achilleas Mantzios
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200612111745.35227.achill>