public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Eliminate constants in Fork.java; use malloc, not alloca.
Date: Sat, 10 May 2008 16:12:00 -0000	[thread overview]
Message-ID: <20080510161212.4938.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  d76e0603fee48fc72eca9b45c3ccb6fc781cbffa (commit)
      from  88e037617835894d075066f6abfdb41fd7175eb6 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit d76e0603fee48fc72eca9b45c3ccb6fc781cbffa
Author: Andrew Cagney <cagney@redhat.com>
Date:   Sat May 10 08:05:09 2008 -0400

    Eliminate constants in Fork.java; use malloc, not alloca.
    
    frysk-core/frysk/testbed/ChangeLog
    2008-05-09  Andrew Cagney  <cagney@redhat.com>
    
    	* OffspringType.java: Pass File to Fork.daemon.
    
    frysk-sys/frysk/sys/ChangeLog
    2008-05-10  Andrew Cagney  <cagney@redhat.com>
    
    	* Fork.java (NO_TRACE, PTRACE, UTRACE): Delete.
    	(daemon(File,String,String,String,String[],String[])): New.
    	(spawn(File,String,String,String,String[],String[])): New.
    	(ptrace(File,String,String,String,String[],String[])): New.
    	(utrace(File,String,String,String,String[],String[])): New.
    	(spawn(File,String,String,String,String[],long,int)): Delete.
    	(spawn(String[],int)): Delete.
    	* cni/Fork.cxx: Update.
    	* cni/Errno.hxx (MALLOC_STRING, MALLOC_ARGV): Define.

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/testbed/ChangeLog          |    4 +
 frysk-core/frysk/testbed/OffspringType.java |    5 +-
 frysk-sys/frysk/sys/ChangeLog               |   12 ++
 frysk-sys/frysk/sys/Fork.java               |   67 +++++-----
 frysk-sys/frysk/sys/cni/Errno.hxx           |    2 +
 frysk-sys/frysk/sys/cni/Fork.cxx            |  195 ++++++++++++++++-----------
 6 files changed, 176 insertions(+), 109 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/testbed/ChangeLog b/frysk-core/frysk/testbed/ChangeLog
index e34a170..68af896 100644
--- a/frysk-core/frysk/testbed/ChangeLog
+++ b/frysk-core/frysk/testbed/ChangeLog
@@ -1,3 +1,7 @@
+2008-05-09  Andrew Cagney  <cagney@redhat.com>
+
+	* OffspringType.java: Pass File to Fork.daemon.
+
 2008-04-17  Andrew Cagney  <cagney@redhat.com>
 
 	* FunitThreadsOffspring.java: Use frysk.config.Prefix.
diff --git a/frysk-core/frysk/testbed/OffspringType.java b/frysk-core/frysk/testbed/OffspringType.java
index 832de16..23739f5 100644
--- a/frysk-core/frysk/testbed/OffspringType.java
+++ b/frysk-core/frysk/testbed/OffspringType.java
@@ -39,6 +39,7 @@
 
 package frysk.testbed;
 
+import java.io.File;
 import frysk.proc.TaskAttachedObserverXXX;
 import frysk.sys.Fork;
 import frysk.proc.Manager;
@@ -61,7 +62,9 @@ public abstract class OffspringType {
 						    String stdout,
 						    String stderr,
 						    String[] argv) {
-		return Fork.daemon(stdin, stdout, stderr, argv);
+		return Fork.daemon(new File(argv[0]),
+				   stdin, stdout, stderr,
+				   argv);
 	    }
 	};
     /**
diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog
index a8cd1cd..01f3ea6 100644
--- a/frysk-sys/frysk/sys/ChangeLog
+++ b/frysk-sys/frysk/sys/ChangeLog
@@ -1,3 +1,15 @@
+2008-05-10  Andrew Cagney  <cagney@redhat.com>
+
+	* Fork.java (NO_TRACE, PTRACE, UTRACE): Delete.
+	(daemon(File,String,String,String,String[],String[])): New.
+	(spawn(File,String,String,String,String[],String[])): New.
+	(ptrace(File,String,String,String,String[],String[])): New.
+	(utrace(File,String,String,String,String[],String[])): New.
+	(spawn(File,String,String,String,String[],long,int)): Delete.
+	(spawn(String[],int)): Delete.
+	* cni/Fork.cxx: Update.
+	* cni/Errno.hxx (MALLOC_STRING, MALLOC_ARGV): Define.
+	
 2008-05-09  Andrew Cagney  <cagney@redhat.com>
 
 	* jni/PseudoTerminal.cxx: Use String's JNI methods.
diff --git a/frysk-sys/frysk/sys/Fork.java b/frysk-sys/frysk/sys/Fork.java
index 5a74504..99dc9a2 100644
--- a/frysk-sys/frysk/sys/Fork.java
+++ b/frysk-sys/frysk/sys/Fork.java
@@ -47,17 +47,18 @@ import java.io.File;
  */
 
 public final class Fork {
-    static final int NO_TRACE = 0;
-    static final int UTRACE = 1;
-    static final int PTRACE = 2;
-    private static native ProcessIdentifier spawn(File exe,
-						  String in, String out,
-						  String err,
-						  String[] args, 
-						  long environ, int trace);
-    private static ProcessIdentifier spawn(String[] args, int trace) {
-	return spawn(new File(args[0]), null, null, null, args, 0, trace);
-    }
+    private static native int spawn(File exe,
+				    String in, String out, String err,
+				    String[] args, long environ);
+    private static native int ptrace(File exe,
+				     String in, String out, String err,
+				     String[] args, long environ);
+    private static native int utrace(File exe,
+				     String in, String out, String err,
+				     String[] args, long environ);
+    private static native int daemon(File exe,
+				     String in, String out, String err,
+				     String[] args, long environ);
 
     /**
      * Create a child process running EXE with arguments ARGS[0..].
@@ -67,7 +68,8 @@ public final class Fork {
     public static ProcessIdentifier exec(File exe,
 					 String in, String out,
 					 String err, String[] args) {
-	return spawn(exe, in, out, err, args, 0, NO_TRACE);
+	return ProcessIdentifierFactory.create
+	    (spawn(exe, in, out, err, args, 0));
     }
     /**
      * Create a child process running EXE with arguments ARGS[0..].
@@ -76,14 +78,16 @@ public final class Fork {
      */
     public static ProcessIdentifier exec(String in, String out,
 					 String err, String[] args) {
-	return spawn(new File(args[0]), in, out, err, args, 0, NO_TRACE);
+	return ProcessIdentifierFactory.create
+	    (spawn(new File(args[0]), in, out, err, args, 0));
     }
     /**
      * Create a child process running ARGS[0] with arguments
      * ARGS[0..].
      */
     public static ProcessIdentifier exec(String[] args) {
-	return spawn(args, NO_TRACE);
+	return ProcessIdentifierFactory.create
+	    (spawn(new File(args[0]), null, null, null, args, 0));
     }
 
     /**
@@ -93,19 +97,22 @@ public final class Fork {
      * Also wire up IN, OUT, and ERR.
      */
     public static ProcessIdentifier ptrace(File exe,
-					   String in, String out, 
-					   String err, String[] args, String libs) {
+					   String in, String out, String err,
+					   String[] args,
+					   String libs) {
 	Environ environ = new Environ();
 	environ.setEnv("LD_LIBRARY_PATH", libs);
 	long env = environ.putEnviron();
-	return spawn(exe, in, out, err, args, env, PTRACE);
+	return ProcessIdentifierFactory.create
+	    (ptrace(exe, in, out, err, args, env));
     }
     /**
      * Create a child process running ARGS[0] with arguments
      * ARGS[0...]; mark the process for tracing.
      */
     public static ProcessIdentifier ptrace(String[] args) {
-	return spawn(args, PTRACE);
+	return ProcessIdentifierFactory.create
+	    (ptrace(new File(args[0]), null, null, null, args, 0));
     }
 
     /**
@@ -117,38 +124,34 @@ public final class Fork {
     public static ProcessIdentifier utrace(File exe,
 					   String in, String out,
 					   String err, String[] args) {
-	return spawn(exe, in, out, err, args, 0, UTRACE);
+	return ProcessIdentifierFactory.create
+	    (utrace(exe, in, out, err, args, 0));
     }
     /**
      * Create a child process running ARGS[0] with arguments
      * ARGV[0...]; mark the process for utracing.
      */
     public static ProcessIdentifier utrace(String[] args) {
-	return spawn(args, UTRACE);
+	return ProcessIdentifierFactory.create
+	    (utrace(new File(args[0]), null, null, null, args, 0));
     }
 
     /**
      * Create a "daemon" process running ARGV[0] with arguments
      * ARGV[1...]; a daemon has process ID 1 as its parent.
-     *
-     * Also wire up IN, OUT, and ERR.
-     */
-    public static native ProcessIdentifier daemon(File exe,
-						  String in, String out,
-						  String err, String[] argv);
-    /**
-     * Create a "daemon" process running ARGV[0] with arguments
-     * ARGV[1...]; a daemon has process ID 1 as its parent.
      */
-    public static ProcessIdentifier daemon(String in, String out, String err,
+    public static ProcessIdentifier daemon(File exe,
+					   String in, String out, String err,
 					   String[] argv) {
-	return daemon(new File(argv[0]), in, out, err, argv);
+	return ProcessIdentifierFactory.create
+	    (daemon(exe, in, out, err, argv, 0));
     }
     /**
      * Create a "daemon" process running ARGV[0] with arguments
      * ARGV[1...]; a daemon has process ID 1 as its parent.
      */
     public static ProcessIdentifier daemon(String[] argv) {
-	return daemon(new File(argv[0]), null, null, null, argv);
+	return ProcessIdentifierFactory.create
+	    (daemon(new File(argv[0]), null, null, null, argv, 0));
     }
 }
diff --git a/frysk-sys/frysk/sys/cni/Errno.hxx b/frysk-sys/frysk/sys/cni/Errno.hxx
index 6631668..6bcde43 100644
--- a/frysk-sys/frysk/sys/cni/Errno.hxx
+++ b/frysk-sys/frysk/sys/cni/Errno.hxx
@@ -74,12 +74,14 @@ extern int tryOpen (const char *file, int flags, int mode);
 extern size_t sizeof_argv (jstringArray argv);
 extern char** fill_argv (void* p, jstringArray argv);
 #define ALLOCA_ARGV(ARGV) (fill_argv (alloca (sizeof_argv (ARGV)), (ARGV)))
+#define MALLOC_ARGV(ARGV) (fill_argv (JvMalloc (sizeof_argv (ARGV)), (ARGV)))
 /**
  * Convert S, a String, into a C char* alocated on the stack.
  */
 extern size_t sizeof_string (jstring s);
 extern char* fill_string (void* p, jstring s);
 #define ALLOCA_STRING(S) (fill_string (alloca (sizeof_string (S)), (S)))
+#define MALLOC_STRING(S) (fill_string (JvMalloc (sizeof_string (S)), (S)))
 
 /**
  * Throw an ArrayIndexOutOfBounds exception if START and LENGTH do not
diff --git a/frysk-sys/frysk/sys/cni/Fork.cxx b/frysk-sys/frysk/sys/cni/Fork.cxx
index c2f36dc..74db54c 100644
--- a/frysk-sys/frysk/sys/cni/Fork.cxx
+++ b/frysk-sys/frysk/sys/cni/Fork.cxx
@@ -38,7 +38,6 @@
 // exception.
 
 #include <stdio.h>
-#include <alloca.h>
 #include <errno.h>
 #include <unistd.h>
 #include <sys/ptrace.h>
@@ -54,46 +53,71 @@
 #include "frysk/sys/ProcessIdentifier.h"
 #include "frysk/sys/ProcessIdentifierFactory.h"
 
+enum tracing {
+  DAEMON,
+  NO_TRACE,
+  PTRACE,
+  UTRACE,
+};
+
 static void
-reopen (jstring file, const char *mode, FILE *stream)
-{
+reopen(const char* file, const char* mode, FILE *stream) {
   if (file == NULL)
     return;
-  int len = JvGetStringUTFLength (file);
-  char *fileName = (char *) alloca (len + 1);
-  JvGetStringUTFRegion (file, 0, file->length (), fileName);
-  fileName[len] = '\0';
   errno = 0;
-  ::freopen (fileName, mode, stream);
+  ::freopen(file, mode, stream);
   if (errno != 0) {
-    ::perror ("freopen");
-    ::_exit (errno);
+    // Should not happen!
+    ::perror("freopen");
+    ::_exit(errno);
   }
 }
 
-int
-spawn(java::io::File* exe, jstring in, jstring out, jstring err,
-      jstringArray args, jlong environ, jint trace)
-{
-  // Convert args into argv, argc, filename.
-  char *filename = ALLOCA_STRING(exe->getPath());
-  int argc = JvGetArrayLength (args);
-  char **argv = (char **) alloca ((argc + 1) * sizeof (void*));
-  for (int i = 0; i < argc; i++) {
-    jstring arg = elements (args)[i];
-    int len = JvGetStringUTFLength (arg);
-    argv[i] = (char *) alloca (len + 1);
-    JvGetStringUTFRegion (arg, 0, arg->length (), argv[i]);
-    argv[i][len] = '\0';
+/**
+ * Spawn a child, return the PID or the -ERROR.
+ */
+static int
+spawn(const char* exePath,
+      const char* inPath, const char* outPath, const char* errPath,
+      int argc, char** argv, char** environ, tracing trace) {
+
+  if (trace == DAEMON) {
+    // Do a vfork(), fork(), exec() which lets the top level process
+    // capture the middle level fork()'s return value in a volatile.
+    volatile int pid = -1;
+    register int v;
+    errno = 0;
+    v = vfork ();
+    switch (v) {
+    case 0:
+      // This is executed by the child with the parent blocked, the
+      // final process id ends up in PID.
+      pid = ::spawn(exePath, inPath, outPath, errPath, argc, argv, 0, NO_TRACE);
+      _exit (0);
+    case -1:
+      // This is executed after a vfork barfs.
+      return -errno;
+    default:
+      // This is executed after the child has set PID with a FORK and
+      // then exited (which helps guarentee that the waitpid, below,
+      // doesn't block.
+      if (pid < 0)
+	return -errno;
+      // Consume the middle players wait.
+      int status;
+      errno = 0;
+      if (waitpid (v, &status, 0) < 0)
+	return -errno;
+      return pid;
+    }
   }
-  argv[argc] = 0;
 
   // Fork/exec
   errno = 0;
   pid_t pid = fork ();
   switch (pid) {
   case -1: // Fork failed.
-    throwErrno (errno, "fork");
+    return -errno;
   default: // Parent
     return pid;
   case 0: // Child
@@ -102,75 +126,94 @@ spawn(java::io::File* exe, jstring in, jstring out, jstring err,
     sigfillset(&mask);
     ::sigprocmask(SIG_UNBLOCK, &mask, NULL);
     // Redirect stdio.
-    reopen (in, "r", stdin);
-    reopen (out, "w", stdout);
-    reopen (err, "w", stderr);
+    reopen(inPath, "r", stdin);
+    reopen(outPath, "w", stdout);
+    reopen(errPath, "w", stderr);
     switch (trace) {
-    case frysk::sys::Fork::PTRACE:
+    case PTRACE:
       errno = 0;
-      ::ptrace ((enum __ptrace_request) PTRACE_TRACEME, 0, 0, 0);
+      ::ptrace((enum __ptrace_request) PTRACE_TRACEME, 0, 0, 0);
       if (errno != 0) {
 	::perror ("ptrace.traceme");
-	::_exit (errno);
+	::_exit(errno);
       }
       break;
-    case frysk::sys::Fork::UTRACE:
+    case UTRACE:
       fprintf(stderr, "\n\n>>>>> in spawn(...utrace)\n\n");
       break;
-    case frysk::sys::Fork::NO_TRACE:
+    case NO_TRACE:
+      break;
+    case DAEMON:
       break;
     }
-     if (environ != 0) {
-	::execve (filename, argv, (char **)environ);
-       }
-     else
-      ::execv (filename, argv);
+    if (environ != NULL) {
+      ::execve(exePath, argv, environ);
+    } else
+      ::execv(exePath, argv);
     // This should not happen.
-    ::perror ("execvp");
+    ::perror("execvp");
     ::_exit (errno);
   }
 }
 
-frysk::sys::ProcessIdentifier*
+/**
+ * Convert convert to native and then spawn.
+ */
+static int
+spawn(java::io::File* exe,
+      jstring in, jstring out, jstring err,
+      jstringArray args, jlong environ, tracing trace) {
+  char* exePath = MALLOC_STRING(exe->getPath());
+  char* inPath = MALLOC_STRING(in);
+  char* outPath = MALLOC_STRING(out);
+  char* errPath = MALLOC_STRING(err);
+  int argc = args->length;
+  char** argv = MALLOC_ARGV(args);
+  int pid = ::spawn(exePath, inPath, outPath, errPath,
+		    argc, argv, (char**)environ, trace);
+  JvFree(exePath);
+  JvFree(inPath);
+  JvFree(outPath);
+  JvFree(errPath);
+  JvFree(argv);
+  if (pid < 0) {
+    switch (trace) {
+    case NO_TRACE:
+      throwErrno(-pid, "fork/exec");
+    case DAEMON:
+      throwErrno(-pid, "vfork/wait");
+    case PTRACE:
+      throwErrno(-pid, "fork/ptrace/exec");
+    case UTRACE:
+      throwErrno(-pid, "utrace");
+    }
+  }
+  return pid;
+}
+
+jint
 frysk::sys::Fork::spawn(java::io::File* exe,
 			jstring in, jstring out, jstring err,
-			jstringArray args, jlong environ, jint trace) {
-  int pid = ::spawn(exe, in, out, err, args, environ, trace);
-  return frysk::sys::ProcessIdentifierFactory::create(pid);
+			jstringArray args, jlong environ) {
+  return ::spawn(exe, in, out, err, args, environ, NO_TRACE);
 }
 
-frysk::sys::ProcessIdentifier*
-frysk::sys::Fork::daemon (java::io::File* exe, jstring in, jstring out,
-			  jstring err, jstringArray args)
-{
-  volatile int pid = -1;
-  register int v;
-  errno = 0;
-  v = vfork ();
-
-  // This is executed by the child with the parent blocked, the final
-  // process id ends up in PID.
-
-  if (v == 0) {
-    pid = ::spawn(exe, in, out, err, args, 0, frysk::sys::Fork::NO_TRACE);
-    _exit (0);
-  }
-
-  // This is executed after the child has exited (which helps
-  // guarentee that the waitpid, below, doesn't block.
-
-  if (v < 0)
-    throwErrno (errno, "vfork");
-  if (pid < 0)
-    throwErrno (errno, "fork");
-  
-  // Consume the middle players wait.
-  int status;
-  errno = 0;
-  if (waitpid (v, &status, 0) < 0)
-    throwErrno (errno, "waitpid", "process %d", v);
+jint
+frysk::sys::Fork::ptrace(java::io::File* exe,
+			jstring in, jstring out, jstring err,
+			jstringArray args, jlong environ) {
+  return ::spawn(exe, in, out, err, args, environ, PTRACE);
+}
 
-  // printf ("v %d pid %d\n", v, pid);
+jint
+frysk::sys::Fork::utrace(java::io::File* exe,
+			jstring in, jstring out, jstring err,
+			jstringArray args, jlong environ) {
+  return ::spawn(exe, in, out, err, args, environ, UTRACE);
+}
 
-  return frysk::sys::ProcessIdentifierFactory::create(pid);
+jint
+frysk::sys::Fork::daemon (java::io::File* exe, jstring in, jstring out,
+			  jstring err, jstringArray args, jlong environ) {
+  return ::spawn(exe, in, out, err, args, environ, DAEMON);
 }


hooks/post-receive
--
frysk system monitor/debugger


                 reply	other threads:[~2008-05-10 16:12 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080510161212.4938.qmail@sourceware.org \
    --to=cagney@sourceware.org \
    --cc=frysk-cvs@sourceware.org \
    --cc=frysk@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).