From: Gerhard H. <Ger...@pe...> - 2009-07-08 14:46:41
|
Hello, I have created may own root Filesystem for Gumstix Verdex XL6P using openEmbedded. I checked out the version 318M and just added IMAGE_INSTALL += " classpath jamvm " After flashing that rootfs to to Verdex COM the java vm is available and everything is fine. The version of * jamvm is 1.5.0 and * classpath is 0.95 (default compiler settings for jamvm and classpath were used) But when using UDP Sockets DatagramSocket.close() isn't processed in the right way. The UDP socket is still opened, after executing close. Please refere to the UdpServerTest.java demo below at the end of this email. The following tasks are done: 1) a UDP port is opened (port 4711) and 2) in a seperated thread a listener at this UDP port is started 3) After pressing any Key (accept 's') and Enter 4) the Server (SsuListener) shall be stopped again 4.1) first by closing the DatagramSocket and 4.2) second stopping the tread using the depricated method Tread.stop as well in case of 's' was pressed the thread shall be stopped hardly (which doesn't work at gumstix as well). On Windows Vista and Kubuntu 7.04 the result of UdpServerTest.java running on Suns JRE 1.5 is: ------------ Output as it should be -------------- create receiver, udp port: 4711 start receiver start receiver thread r stopReceiver called. receiver thread stopped!!! Test Application stopped. ------------ END OF Output as it should be -------------- On Gumstix (318M) running under jamvm (1.5.0) and classpath (0.95) the result is: ----------- wrong Gumstix Output ----------------------------- root@gumstix-custom-verdex:~$ java -jar udpServerTest.jar create receiver, udp port: 4711 start receiver start receiver thread r stopReceiver called. Test Application stopped. -------- END OF wrong Gumstix Output ------------------ Here we can see, that the run method of SsuListener Thread doesn't end because "receiver thread stopped!!!" is not written to stdout. "netstat -a |grep 4711" on another terminal session still shows: "udp 0 0 *:4711" which means, that the UDP socket is NOT CLOSED right now. So the application needs to be stoped using CNTRL+C. That it can be started in another Terminal Session without any Error like "java.net.BindException: Address already in use...". On Windows and Kubuntu the application stops by itself, so it can be started in another Terminal Session without any problems. Does anyone have an idea how I could solve my problem (maybe screwing on some compiler options, ...)? Thanks a lot in advance for your help cheers Gerhard ------------------ UdpServerTest.java BEGIN -------------------------- ---- for testing, just cut from here .... ----------------------------- import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; public class UdpServerTest { private boolean doRun; private SsuListener ssuListener; byte [] dataBuffer; DatagramPacket packet; DatagramSocket ssuRcvSocket; public UdpServerTest(int udpPortNum) throws SocketException { System.out.println("create receiver, udp port: "+udpPortNum); dataBuffer = new byte[1500]; packet = new DatagramPacket ( dataBuffer, dataBuffer.length ); ssuRcvSocket = new DatagramSocket ( udpPortNum ); } public boolean startReceiver() { System.out.println("start receiver"); if (!this.doRun) { this.doRun = true; ssuListener = new SsuListener(); ssuListener.start(); } return true; } public boolean stopReceiver(boolean stopThread) { System.out.println("stopReceiver called."); this.doRun=false; this.ssuRcvSocket.close(); if(stopThread){ this.ssuListener.stop(); System.out.println("Receiver Thread.stop executed."); } try { Thread.sleep(100); } catch (InterruptedException e) { } return true; } class SsuListener extends Thread { public void run() { doRun = true; System.out.println("start receiver thread"); while (doRun) { try { ssuRcvSocket.receive( packet ); System.out.println("packet received, length: "+packet.getLength()); } catch (Exception e) { if (doRun) { System.out.println("udp receive failed in receiver thread "+e); } doRun = false; } } System.out.println("receiver thread stopped!!!"); } } public static void main(String[] args) { UdpServerTest srv; try { srv = new UdpServerTest (4711); srv.startReceiver(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } try { int i=System.in.read(); boolean stop = i=='s'; srv.stopReceiver(stop); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println ("Test Application stopped."); } } ------------------- .... till here ---------------------------------------------------- ------------------ UdpServerTest.java END --------------------------- |
From: Gerhard H. <Ger...@pe...> - 2009-07-29 13:24:18
|
Hello again, I am still fighting to get to run our test program UdpServerTest.java on JamVm 1.5.0 and classpath 0.96.1 (was wrong in the last mail) without success till now. What I found was a bug in classpath (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15430) which exactly describes the problem I have. Also the attached Testprogram SocketClose.java doesn't work on gumstix. There must be another problem, because the bugfix described there is already part of v0.96 - I checked the sourcecode. What I found else is, that on Ubuntu 8.10 with jamVm V1.4.5 and classpath v0.96.1 and JamVm v1.5.0 (build by mayself) and classpath v0.96.1 SocketClose.java and UdpServerTest.java failed as well. So it seems, that the bug 15430 is still there, but the fix is in the sourcecode! At the moment I try to get to run jamVm 1.5.3 and classpath 0.98 on Ubuntu 8.10, but I have big problems to get to build classpath 0.98. Maybe it would be easier to upgrade on my openEmbedded system for gumstix? Can somebody give me some help where to screw to get the newest versions (jamVm v1.5.3 and classpath v0.98)? Does anybody have some experience in building classpath? Maybe a config switch would solve the problem ... cheers Gerhard |