From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16337 invoked by alias); 22 May 2008 17:44:47 -0000 Received: (qmail 16300 invoked by uid 367); 22 May 2008 17:44:47 -0000 Date: Thu, 22 May 2008 17:44:00 -0000 Message-ID: <20080522174447.16285.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Re-implement frysk.testbed.ForkFactory using Fork.spawn. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 05dbb548a7214062166c1cd7eb447c3ef7ca88d1 X-Git-Newrev: bdd9bad5f20ab08bd3f23c1db6db0c43e46b40a0 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00271.txt.bz2 The branch, master has been updated via bdd9bad5f20ab08bd3f23c1db6db0c43e46b40a0 (commit) via fbc436467a694e9cd8533035bacd03eeb78e4564 (commit) via f275ed365e905846bbe07154bc93314d9f91f3ee (commit) from 05dbb548a7214062166c1cd7eb447c3ef7ca88d1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit bdd9bad5f20ab08bd3f23c1db6db0c43e46b40a0 Author: Andrew Cagney Date: Thu May 22 13:43:17 2008 -0400 Re-implement frysk.testbed.ForkFactory using Fork.spawn. frysk-sys/frysk/sys/ChangeLog 2008-05-22 Andrew Cagney * jni/Fork.hxx (class redirect_nostdin): New. * cni/Fork.hxx (class redirect_nostdin): New. frysk-sys/frysk/testbed/ChangeLog 2008-05-22 Andrew Cagney * TestForkFactory.java: New. * cni/ForkFactory.cxx: New. * jni/ForkFactory.cxx: New. commit fbc436467a694e9cd8533035bacd03eeb78e4564 Author: Andrew Cagney Date: Thu May 22 12:27:14 2008 -0400 Delete frysk.testbed.Tee frysk-sys/frysk/sys/ChangeLog 2008-05-22 Andrew Cagney * TestPipePair.java (testDaemonExecute()): Delete. (testChildExecute()): Delete. frysk-sys/frysk/testbed/ChangeLog 2008-05-22 Andrew Cagney * ForkFactory.java: Don't use Execute. * Tee.java: Delete. * cni/Tee.java: Delete. * jni/Tee.java: Delete. commit f275ed365e905846bbe07154bc93314d9f91f3ee Author: Andrew Cagney Date: Thu May 22 11:52:57 2008 -0400 Fix errno, vs error typos. frysk-sys/ChangeLog 2008-05-22 Andrew Cagney * Makefile.am (JniRunner): Add frysk.testbed. frysk-sys/jnixx/ChangeLog 2008-05-22 Andrew Cagney * exceptions.cxx (errnoException): Pass up error, not errno. (errnoException): Ditto. ----------------------------------------------------------------------- Summary of changes: frysk-sys/ChangeLog | 2 + frysk-sys/Makefile.am | 2 +- frysk-sys/frysk/sys/ChangeLog | 6 +++ frysk-sys/frysk/sys/TestPipePair.java | 19 --------- frysk-sys/frysk/sys/cni/Fork.hxx | 15 +++++++ frysk-sys/frysk/sys/jni/Fork.hxx | 15 +++++++ frysk-sys/frysk/testbed/ChangeLog | 10 +++++ frysk-sys/frysk/testbed/ForkFactory.java | 15 +----- .../testbed/{jni/Tee.cxx => TestForkFactory.java} | 23 ++++++---- .../testbed/{Tee.java => cni/ForkFactory.cxx} | 43 ++++++++++++++------ .../testbed/{cni/Tee.cxx => jni/ForkFactory.cxx} | 35 ++++++++++++---- frysk-sys/jnixx/ChangeLog | 3 + frysk-sys/jnixx/exceptions.cxx | 4 +- 13 files changed, 127 insertions(+), 65 deletions(-) rename frysk-sys/frysk/testbed/{jni/Tee.cxx => TestForkFactory.java} (85%) rename frysk-sys/frysk/testbed/{Tee.java => cni/ForkFactory.cxx} (74%) rename frysk-sys/frysk/testbed/{cni/Tee.cxx => jni/ForkFactory.cxx} (76%) First 500 lines of diff: diff --git a/frysk-sys/ChangeLog b/frysk-sys/ChangeLog index 814a8e1..5dd0474 100644 --- a/frysk-sys/ChangeLog +++ b/frysk-sys/ChangeLog @@ -1,5 +1,7 @@ 2008-05-22 Andrew Cagney + * Makefile.am (JniRunner): Add frysk.testbed. + * Makefile.am (JniRunner): Add TestStatelessFile and TestPseudoTerminal. diff --git a/frysk-sys/Makefile.am b/frysk-sys/Makefile.am index e8ae3e6..dbc9742 100644 --- a/frysk-sys/Makefile.am +++ b/frysk-sys/Makefile.am @@ -103,7 +103,7 @@ JniRunner: | frysk-sys.jar libfrysk-sys-jni.so echo " frysk.sys.TestPseudoTerminal \\" >> $@.tmp echo " frysk.sys.TestSignal \\" >> $@.tmp echo " frysk.sys.TestSignalSet \\" >> $@.tmp - echo " frysk.sys.TestStatelessFile \\" >> $@.tmp + echo " frysk.testbed \\" >> $@.tmp echo " inua \\" >> $@.tmp echo " jnixx \\" >> $@.tmp echo " lib.stdcpp \\" >> $@.tmp diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog index 8bd46c2..887b67c 100644 --- a/frysk-sys/frysk/sys/ChangeLog +++ b/frysk-sys/frysk/sys/ChangeLog @@ -1,5 +1,11 @@ 2008-05-22 Andrew Cagney + * jni/Fork.hxx (class redirect_nostdin): New. + * cni/Fork.hxx (class redirect_nostdin): New. + + * TestPipePair.java (testDaemonExecute()): Delete. + (testChildExecute()): Delete. + * jni/Poll.cxx: Implement. * jni/AuditLibs.cxx: Implement. * jni/StatelessFile.cxx: Implement. diff --git a/frysk-sys/frysk/sys/TestPipePair.java b/frysk-sys/frysk/sys/TestPipePair.java index 85e1fe4..e5a6daf 100644 --- a/frysk-sys/frysk/sys/TestPipePair.java +++ b/frysk-sys/frysk/sys/TestPipePair.java @@ -40,7 +40,6 @@ package frysk.sys; import frysk.junit.TestCase; -import frysk.testbed.Tee; import frysk.rsl.Log; import frysk.config.Prefix; @@ -109,24 +108,6 @@ public class TestPipePair extends TestCase { verifyIO (); } - /** - * Test a daemon assembly file. - */ - public void testDaemonExecute () - { - pipe = new DaemonPipePair (new Tee ()); - verifyIO (); - } - - /** - * Test a child assembly file. - */ - public void testChildExecute () - { - pipe = new ChildPipePair (new Tee ()); - verifyIO (); - } - private String[] funitProcMask = new String[] { Prefix.pkgLibFile("funit-procmask").getPath(), "-n", diff --git a/frysk-sys/frysk/sys/cni/Fork.hxx b/frysk-sys/frysk/sys/cni/Fork.hxx index 11137d8..6352cd1 100644 --- a/frysk-sys/frysk/sys/cni/Fork.hxx +++ b/frysk-sys/frysk/sys/cni/Fork.hxx @@ -56,6 +56,18 @@ public: } }; +/** + * Just close standard input; leave the rest as is. + */ +class redirect_nostdin : public redirect { + void reopen() { + ::close(0); + } +}; + +/** + * What to do once the child/daemon process fork as occured. + */ class exec { public: virtual void execute() = 0; @@ -64,6 +76,9 @@ public: } }; +/** + * exec the specified program. + */ class exec_program : public exec { char* exePath; char** argv; diff --git a/frysk-sys/frysk/sys/jni/Fork.hxx b/frysk-sys/frysk/sys/jni/Fork.hxx index c92ea61..b64feb2 100644 --- a/frysk-sys/frysk/sys/jni/Fork.hxx +++ b/frysk-sys/frysk/sys/jni/Fork.hxx @@ -56,6 +56,18 @@ public: } }; +/** + * Just close standard input; leave the rest as is. + */ +class redirect_nostdin : public redirect { + void reopen() { + ::close(0); + } +}; + +/** + * What to do once the child/daemon process fork as occured. + */ class exec { public: virtual void execute() = 0; @@ -64,6 +76,9 @@ public: } }; +/** + * exec the specified program. + */ class exec_program : public exec { StringChars exe; const char* exeElements; diff --git a/frysk-sys/frysk/testbed/ChangeLog b/frysk-sys/frysk/testbed/ChangeLog index 587259c..3ac4e87 100644 --- a/frysk-sys/frysk/testbed/ChangeLog +++ b/frysk-sys/frysk/testbed/ChangeLog @@ -1,3 +1,13 @@ +2008-05-22 Andrew Cagney + + * TestForkFactory.java: New. + * cni/ForkFactory.cxx: New. + * jni/ForkFactory.cxx: New. + * ForkFactory.java: Don't use Execute. + * Tee.java: Delete. + * cni/Tee.java: Delete. + * jni/Tee.java: Delete. + 2008-05-14 Andrew Cagney * jni/LocalMemory.cxx: Update #includes to match jnixx rename. diff --git a/frysk-sys/frysk/testbed/ForkFactory.java b/frysk-sys/frysk/testbed/ForkFactory.java index 6c06e96..e42f50c 100644 --- a/frysk-sys/frysk/testbed/ForkFactory.java +++ b/frysk-sys/frysk/testbed/ForkFactory.java @@ -41,15 +41,13 @@ package frysk.testbed; import frysk.rsl.Log; import frysk.junit.TestCase; -import frysk.sys.Execute; import frysk.sys.Signal; -import frysk.sys.Itimer; import frysk.sys.ProcessIdentifier; +import frysk.sys.ProcessIdentifierFactory; import frysk.sys.ptrace.Ptrace; import frysk.sys.Wait; import frysk.sys.UnhandledWaitBuilder; import frysk.sys.SignalBuilder; -import frysk.sys.DaemonFactory; /** * Create a copy of this process running as a daemon. @@ -59,19 +57,12 @@ public class ForkFactory { private static final Log fine = Log.fine(ForkFactory.class); public static ProcessIdentifier detachedDaemon() { - ProcessIdentifier pid = DaemonFactory.create(new Execute() { - final int timeout = TestCase.getTimeoutSeconds(); - public void execute() { - int remaining = timeout; - do - remaining -= Itimer.sleep (remaining); - while (remaining > 0); - } - }); + ProcessIdentifier pid = ProcessIdentifierFactory.create(fork(TestCase.getTimeoutSeconds())); TearDownProcess.add(pid); fine.log("detachedDaemon", pid); return pid; } + private static native int fork(int timeout); public static ProcessIdentifier attachedDaemon() { ProcessIdentifier pid = detachedDaemon(); diff --git a/frysk-sys/frysk/testbed/jni/Tee.cxx b/frysk-sys/frysk/testbed/TestForkFactory.java similarity index 85% rename from frysk-sys/frysk/testbed/jni/Tee.cxx rename to frysk-sys/frysk/testbed/TestForkFactory.java index 85f3ce7..f71407e 100644 --- a/frysk-sys/frysk/testbed/jni/Tee.cxx +++ b/frysk-sys/frysk/testbed/TestForkFactory.java @@ -37,15 +37,20 @@ // version and license this file solely under the GPL without // exception. -#include -#include +package frysk.testbed; -#include "jni.hxx" +import frysk.junit.TestCase; -void -frysk::testbed::Tee::execute(::jnixx::env env) { - char b; - while (::read (STDIN_FILENO, &b, 1) > 0) { - ::write (STDOUT_FILENO, &b, 1); - } +public class TestForkFactory extends TestCase { + public void tearDown() { + TearDownProcess.tearDown(); + } + public void testDetachedDaemon() { + ForkFactory.detachedDaemon(); + // shouldn't abort. + } + public void testAttachedDaemon() { + ForkFactory.attachedDaemon(); + // shouldn't abort. + } } diff --git a/frysk-sys/frysk/testbed/Tee.java b/frysk-sys/frysk/testbed/cni/ForkFactory.cxx similarity index 74% rename from frysk-sys/frysk/testbed/Tee.java rename to frysk-sys/frysk/testbed/cni/ForkFactory.cxx index aeee7af..3b2eab6 100644 --- a/frysk-sys/frysk/testbed/Tee.java +++ b/frysk-sys/frysk/testbed/cni/ForkFactory.cxx @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2007, Red Hat Inc. +// Copyright 2008 Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -37,19 +37,36 @@ // version and license this file solely under the GPL without // exception. -package frysk.testbed; +#include +#include +#include +#include -import frysk.sys.Execute; +#include -/** - * XXX: Instead of having TestPipePair implement Execute, this - * static nested class is used. This is to avoid having a native - * class that extends junit.framework.TestCase - a header file for - * which which isn't available. - */ +#include "frysk/sys/cni/Errno.hxx" +#include "frysk/testbed/ForkFactory.h" +#include "frysk/sys/cni/Fork.hxx" -public class Tee - implements Execute -{ - public native void execute (); +class exec_sleep : public exec { +private: + int timeout; +public: + exec_sleep(int timeout) { + this->timeout = timeout; + } + void execute() { + int remaining = timeout; + do + remaining -= ::sleep(remaining); + while (remaining > 0); + ::_exit(0); + } +}; + +jint +frysk::testbed::ForkFactory::fork(jint timeout) { + exec_sleep sleeper = exec_sleep(timeout); + redirect_nostdin nostdin = redirect_nostdin(); + return ::spawn(DAEMON, nostdin, sleeper); } diff --git a/frysk-sys/frysk/testbed/cni/Tee.cxx b/frysk-sys/frysk/testbed/jni/ForkFactory.cxx similarity index 76% rename from frysk-sys/frysk/testbed/cni/Tee.cxx rename to frysk-sys/frysk/testbed/jni/ForkFactory.cxx index e14d4d2..034c596 100644 --- a/frysk-sys/frysk/testbed/cni/Tee.cxx +++ b/frysk-sys/frysk/testbed/jni/ForkFactory.cxx @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2007, Red Hat Inc. +// Copyright 2008 Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -37,18 +37,35 @@ // version and license this file solely under the GPL without // exception. +#include #include #include +#include -#include +#include "jni.hxx" -#include "frysk/testbed/Tee.h" +#include "jnixx/elements.hxx" +#include "frysk/sys/jni/Fork.hxx" -void -frysk::testbed::Tee::execute () -{ - char b; - while (::read (STDIN_FILENO, &b, 1) > 0) { - ::write (STDOUT_FILENO, &b, 1); +class exec_sleep : public exec { +private: + int timeout; +public: + exec_sleep(int timeout) { + this->timeout = timeout; } + void execute() { + int remaining = timeout; + do + remaining -= ::sleep(remaining); + while (remaining > 0); + ::_exit(0); + } +}; + +jint +frysk::testbed::ForkFactory::fork(jnixx::env env, jint timeout) { + exec_sleep sleeper = exec_sleep(timeout); + redirect_nostdin nostdin = redirect_nostdin(); + return ::spawn(env, DAEMON, nostdin, sleeper); } diff --git a/frysk-sys/jnixx/ChangeLog b/frysk-sys/jnixx/ChangeLog index d94d3ed..a214ae7 100644 --- a/frysk-sys/jnixx/ChangeLog +++ b/frysk-sys/jnixx/ChangeLog @@ -1,5 +1,8 @@ 2008-05-22 Andrew Cagney + * exceptions.cxx (errnoException): Pass up error, not errno. + (errnoException): Ditto. + * exceptions.cxx (errnoException): Use vasprintf, not snprintf. (runtimeException): Simplify exception checks; throw RuntimeException. * print.cxx (vajprintf): Ditto. diff --git a/frysk-sys/jnixx/exceptions.cxx b/frysk-sys/jnixx/exceptions.cxx index f02d8f9..2f5ce80 100644 --- a/frysk-sys/jnixx/exceptions.cxx +++ b/frysk-sys/jnixx/exceptions.cxx @@ -102,7 +102,7 @@ throwErrno(::jnixx::env& env, int error, const char *fmt, ...) { void errnoException(::jnixx::env& env, int error, const char *prefix) { - throwErrno(env, errno, "%s: %s", prefix, strerror(error)); + throwErrno(env, error, "%s: %s", prefix, strerror(error)); } void @@ -121,7 +121,7 @@ errnoException(::jnixx::env& env, int error, const char *prefix, } va_end(ap); try { - throwErrno(env, errno, "%s: %s (%s)", prefix, strerror(error), message); + throwErrno(env, error, "%s: %s (%s)", prefix, strerror(error), message); } catch (java::lang::Throwable e) { // always executed. ::free(message); hooks/post-receive -- frysk system monitor/debugger