From owner-freebsd-java@FreeBSD.ORG Fri Nov 30 22:40:43 2007 Return-Path: Delivered-To: java@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1400316A418 for ; Fri, 30 Nov 2007 22:40:43 +0000 (UTC) (envelope-from deischen@freebsd.org) Received: from mail.netplex.net (mail.netplex.net [204.213.176.10]) by mx1.freebsd.org (Postfix) with ESMTP id DA13613C442 for ; Fri, 30 Nov 2007 22:40:42 +0000 (UTC) (envelope-from deischen@freebsd.org) Received: from sea.ntplx.net (sea.ntplx.net [204.213.176.11]) by mail.netplex.net (8.14.2/8.14.2/NETPLEX) with ESMTP id lAUMSLBQ027640; Fri, 30 Nov 2007 17:28:21 -0500 (EST) X-Virus-Scanned: by AMaViS and Clam AntiVirus (mail.netplex.net) X-Greylist: Message whitelisted by DRAC access database, not delayed by milter-greylist-4.0 (mail.netplex.net [204.213.176.10]); Fri, 30 Nov 2007 17:28:21 -0500 (EST) Date: Fri, 30 Nov 2007 17:28:21 -0500 (EST) From: Daniel Eischen X-X-Sender: eischen@sea.ntplx.net To: "Arno J. Klaassen" In-Reply-To: Message-ID: References: <200711301716.lAUHGEV1064334@repoman.freebsd.org> MIME-Version: 1.0 Content-Type: MULTIPART/Mixed; boundary="=-=-=" Content-ID: Cc: nate@yogotech.com, java@freebsd.org Subject: Re: cvs commit: src/lib/libkse/thread thr_kern.c X-BeenThere: freebsd-java@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Daniel Eischen List-Id: Porting Java to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Nov 2007 22:40:43 -0000 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --=-=-= Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Content-ID: On Fri, 30 Nov 2007, Arno J. Klaassen wrote: > > Hello, > > Daniel Eischen writes: > >> deischen 2007-11-30 17:16:14 UTC >> >> FreeBSD src repository >> >> Modified files: >> lib/libkse/thread thr_kern.c >> Log: >> Initialize the current thread and signal locks so that sigaction() >> will work after a fork(). > > > I spotted this patch wrt my .exec() problems. > > Quick recall : I get strange exceptions in java-code doing quite > a lot of .exec() calls, but only on 2x2way SMP, not on UP or > single CPU SMP. > > I get these problems under releng_6 as well, but 'my' only > 2x2way SMP box is a production server I cannot test on. > > Seeing this patch, I retested on a 2x2 SMP box running releng_7(amd64) > libmapping libthr.so.3 to libkse.so.3 for /usr/local/jdk1.5.0/bin/java_g. > > I use the attached test-program (adapted after gentile remarks of Nate > Williams; I hope there's not yet another program error in it but it > does run flawlessly with libthr). > > Running it like "/usr/local/jdk1.5.0/bin/java_g Test_cmd /tmp 0 " > it will produce a java_g.core after a number of iterations > with exit status 139. > > Both with and without the above patch applied (to releng_7) the > gdb trace shows (I recompiled libkse with -g as well, but no > line-numbers showing up ) : > > gdb -core java_g.core /usr/local/jdk1.5.0/bin/java_g > GNU gdb 6.1.1 [FreeBSD] > Copyright 2004 Free Software Foundation, Inc. > GDB is free software, covered by the GNU General Public License, and you are > welcome to change it and/or distribute copies of it under certain conditions. > Type "show copying" to see the conditions. > There is absolutely no warranty for GDB. Type "show warranty" for details. > This GDB was configured as "amd64-marcel-freebsd"... > Core was generated by `java_g'. [ ... ] > (gdb) where > #0 0x000000080075d151 in pthread_sigmask () from /usr/lib/libkse.so.3 > #1 0x000000080075d103 in sigprocmask () from /usr/lib/libkse.so.3 > #2 0x000000080076c423 in pthread_kill () from /usr/lib/libkse.so.3 > #3 0x0000000800758f29 in fork () from /usr/lib/libkse.so.3 > #4 0x0000000801e43158 in jdk_fork_wrapper () This isn't really telling me anything because fork() doesn't call pthread_kill(), and pthread_kill() doesn't call sigprocmask(). -- DE --=-=-= Content-Type: APPLICATION/OCTET-STREAM; CHARSET=US-ASCII Content-Transfer-Encoding: QUOTED-PRINTABLE Content-ID: Content-Description: Content-Disposition: attachment; filename=Test_cmd.java import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.IOException; import java.util.StringTokenizer; final class Test_cmd { public static void main (String[] args) throws Exception { final String path =3D args[0]; final long max_wait_time_ms =3D Long.parseLong(args[1]); final String[] cmd =3D new String[3]; cmd[0] =3D "/bin/sh"; cmd[1] =3D "-c"; cmd[2] =3D "sync; if [ -e " + path + " ]; then df -k " + path; cmd[2] +=3D ";else echo; echo \"x -1 -1 0\";fi "; for (int i=3D 1; i <=3D 999; i++) { final StringBuffer parsed_std_out =3D new StringBuffer(); int last_line_start_index =3D 0; final String line; final StringTokenizer st; final int nr_of_tokens; long free_bytes =3D -1; System.out.println("test <" + i + ">."); execute_command(cmd, max_wait_time_ms, parsed_std_out); last_line_start_index =3D parsed_std_out.lastIndexOf("\n") + 1; if (last_line_start_index < 0) { System.err.println("Failed to find last line start index!"); continue; } line =3D parsed_std_out.substring(last_line_start_index, parsed_std_out.length()); if (line =3D=3D null) { System.err.println("Failed to find last line in std out!"); continue; } st =3D new StringTokenizer(line); nr_of_tokens =3D st.countTokens(); if (nr_of_tokens >=3D 4) { final String free_space_str; // Filesystem st.nextToken(); // 1K-blocks st.nextToken(); // Used st.nextToken(); // Avail free_space_str =3D st.nextToken(); try { free_bytes =3D Long.parseLong(free_space_str); } catch (NumberFormatException nfe) { free_bytes =3D -1; nfe.printStackTrace(); } free_bytes *=3D 1024; } System.out.println("free bytes <" + free_bytes + ">."); } } /* * if _max_wait_time_ms !=3D 0, wait _max_wait_time_ms for std out only= =20 * to finish. So std err ain't checked, and neither is the process itselv= es!! * For the process we simply call detroy in the finally clause * else wait "for ever" untill process has finished. */ public static boolean execute_command(final String[] _cmd,=20 final long _max_wait_time_ms, final StringBuffer _parsed_std_out) { boolean ok =3D false; String full_cmd =3D ""; Process proc =3D null; int exit_value =3D 0; Stream_reader std_out =3D null; Stream_reader std_err =3D null; try { for (int i =3D 0; i < _cmd.length; i++) { if (i > 0) full_cmd +=3D " "; full_cmd +=3D _cmd[i]; } proc =3D Runtime.getRuntime().exec(_cmd); std_out =3D new Stream_reader(proc.getInputStream()); std_err =3D new Stream_reader(proc.getErrorStream()); if (_max_wait_time_ms =3D=3D 0) { proc.waitFor (); std_out.wait_for(); } else std_out.join(_max_wait_time_ms); if (_parsed_std_out !=3D null) _parsed_std_out.append(std_out.get_data()); if ( (exit_value =3D proc.exitValue ()) !=3D 0) { System.err.println("Command <" + full_cmd=20 + "> finished with exit value <" + exit_value + "> Std erro= r is:\n" + std_err.get_data()); } else ok =3D true; } catch (InterruptedException int_ex) { System.err.println("Command <" + full_cmd=20 + "> failed with interrupted exception!"); int_ex.printStackTrace(); exit_value =3D 1; ok =3D false; } catch (IOException io_ex) { System.err.println("Command <" + full_cmd=20 + "> failed with IO exception!"); io_ex.printStackTrace(); io_ex.printStackTrace(); exit_value =3D 1; ok =3D false; } catch (Exception ex) { System.err.println("Command <" + full_cmd=20 + "> failed with exception!"); ex.printStackTrace(); exit_value =3D 1; ok =3D false; } finally { if (proc !=3D null) proc.destroy (); if (std_out !=3D null) std_out.stop(); if (std_err !=3D null) std_err.stop(); } return ok; } /* execute_command */ private static class Stream_reader implements Runnable { private final InputStream input_stream; private final StringBuffer data; private final Thread thread; private boolean stop =3D false; private static final String LINE_SEP =3D "\n"; private Stream_reader(final InputStream _input_stream) { this.input_stream =3D _input_stream; data =3D new StringBuffer(); thread =3D new Thread (this, "Stream_reader"); thread.setPriority (Thread.NORM_PRIORITY); thread.start (); } public void run() { try { BufferedReader buffered_reader =3D new BufferedReader( new InputStreamReader(input_stream)); while (stop =3D=3D false) { final String line; line =3D buffered_reader.readLine(); if (line =3D=3D null) break; if (data.length() > 0) data.append(LINE_SEP); data.append(line); } buffered_reader.close(); } catch (java.io.IOException io_ex) { /* do nothing */ } } /* run */ private String get_data() { return data.toString(); } /* get_data */ private void stop() { stop =3D true; } /* stop */ private void wait_for() { join(0); } /* wait_for */ private void join(final long _max_time_ms) { try { thread.join(_max_time_ms); } catch (InterruptedException int_ex) { int_ex.printStackTrace(); } } /* join */ } /* class Stream_reader */ } =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00= =00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00=00 --=-=-=--