public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Implement throwing of Errno.
Date: Tue, 20 May 2008 20:36:00 -0000	[thread overview]
Message-ID: <20080520203601.22462.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  d3ed25cd5bae28acd1df80690836ca874dc0093a (commit)
      from  24a1e128332990b4e3927543f6f314fb568b331c (commit)

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

- Log -----------------------------------------------------------------
commit d3ed25cd5bae28acd1df80690836ca874dc0093a
Author: Andrew Cagney <cagney@redhat.com>
Date:   Tue May 20 16:16:29 2008 -0400

    Implement throwing of Errno.
    
    frysk-sys/frysk/sys/ChangeLog
    2008-05-20  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/Signal.cxx-sh: Don't leak JNI string pointers.
    
    frysk-sys/jnixx/ChangeLog
    2008-05-20  Andrew Cagney  <cagney@redhat.com>
    
    	* JniBindings.java: Generate attributes such as no-return.
    	* exceptions.cxx (errnoException): Implement.

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

Summary of changes:
 frysk-sys/frysk/sys/ChangeLog         |    2 +
 frysk-sys/frysk/sys/jni/Signal.cxx-sh |    9 ++---
 frysk-sys/jnixx/ChangeLog             |    3 ++
 frysk-sys/jnixx/JniBindings.java      |   35 ++++++++++++++++--
 frysk-sys/jnixx/exceptions.cxx        |   65 ++++++++++++++++++++++++++++++---
 5 files changed, 100 insertions(+), 14 deletions(-)

First 500 lines of diff:
diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog
index efde63d..22e3cb0 100644
--- a/frysk-sys/frysk/sys/ChangeLog
+++ b/frysk-sys/frysk/sys/ChangeLog
@@ -1,5 +1,7 @@
 2008-05-20  Andrew Cagney  <cagney@redhat.com>
 
+	* jni/Signal.cxx-sh: Don't leak JNI string pointers.
+
 	* jni/DaemonFactory.cxx: Implement.
 
 2008-05-17  Andrew Cagney  <cagney@redhat.com>
diff --git a/frysk-sys/frysk/sys/jni/Signal.cxx-sh b/frysk-sys/frysk/sys/jni/Signal.cxx-sh
index 869b301..feb62e8 100644
--- a/frysk-sys/frysk/sys/jni/Signal.cxx-sh
+++ b/frysk-sys/frysk/sys/jni/Signal.cxx-sh
@@ -50,6 +50,7 @@ cat <<EOF
 #include "jni.hxx"
 
 #include "jnixx/exceptions.hxx"
+#include "jnixx/elements.hxx"
 
 void
 frysk::sys::Signal::kill(::jnixx::env env, jint pid, jint sig,
@@ -70,12 +71,10 @@ frysk::sys::Signal::tkill(::jnixx::env env, jint tid, jint sig,
                           ::java::lang::String name) {
   errno = 0;
   if (::syscall(__NR_tkill, tid, sig) < 0) {
-    const char *sname = name.GetStringUTFChars(env);
-    if (sname == NULL)
-      return; // exception pending
+    StringChars sname = StringChars(env, name);
     errnoException(env, errno, "tkill", "task %d, signal %s (%d)",
-    		   tid, sname, sig);
-    name.ReleaseStringUTFChars(env, sname);
+    		   tid, sname.p, sig);
+    sname.free(); // happens during unwind
   }
 }
 
diff --git a/frysk-sys/jnixx/ChangeLog b/frysk-sys/jnixx/ChangeLog
index fb7e090..1125275 100644
--- a/frysk-sys/jnixx/ChangeLog
+++ b/frysk-sys/jnixx/ChangeLog
@@ -1,5 +1,8 @@
 2008-05-20  Andrew Cagney  <cagney@redhat.com>
 
+	* JniBindings.java: Generate attributes such as no-return.
+	* exceptions.cxx (errnoException): Implement.
+
 	* elements.hxx (class FileBytes): Add pid/tid method.
 	* elements.cxx (FileBytes::FileBytes): Implement.
 	(slurp): Refactor out of FileBytes constructor; include NUL in
diff --git a/frysk-sys/jnixx/JniBindings.java b/frysk-sys/jnixx/JniBindings.java
index 42d6614..8ca37ce 100644
--- a/frysk-sys/jnixx/JniBindings.java
+++ b/frysk-sys/jnixx/JniBindings.java
@@ -80,14 +80,16 @@ class JniBindings {
 	private final String returnType;
 	private final String name;
 	private final String[] params;
+	private final String attributes;
 	private final Object[] code;
 	Method(Class klass, Binding binding, String returnType, String name,
-	       String[] params, Object[] code) {
+	       String[] params, String attributes, Object[] code) {
 	    this.klass = klass;
 	    this.binding = binding;
 	    this.returnType = returnType;
 	    this.name = name;
 	    this.params = params;
+	    this.attributes = attributes;
 	    this.code = code;
 	}
 	public int hashCode() {
@@ -122,7 +124,13 @@ class JniBindings {
 		}
 		p.print(params[i]);
 	    }
-	    p.println(");");
+	    p.print(")");
+	    if (attributes != null) {
+		p.print(" ");
+		p.print(attributes);
+	    }
+	    p.println(";");
+	    
 	}
 	void printDefinition(Class klass, Printer p) {
 	    if (binding == Binding.STATIC && klass != this.klass) {
@@ -167,10 +175,10 @@ class JniBindings {
 	    return methods;
 	}
 	JniMap put(Class klass, Binding binding, String returnType,
-		   String name, String[] params,
+		   String name, String[] params, String attributes,
 		   Object[] code) {
 	    get(klass).add(new Method(klass, binding, returnType, name,
-				      params, code));
+				      params, attributes, code));
 	    return this;
 	}
 	void printDeclarations(Class klass, Printer p) {
@@ -201,6 +209,7 @@ class JniBindings {
 	     "::jnixx::env", "_env_",
 	     new String[] {
 	     },
+	     null,
 	     new Object[] {
 		 "void* _jni;",
 		 "::jnixx::vm->GetEnv(&_jni, JNI_VERSION_1_2);",
@@ -211,6 +220,7 @@ class JniBindings {
 	     new String[] {
 		 "jobject", "_object",
 	     },
+	     null,
 	     new Object[] {
 		 "return this->_object == _object;",
 	     })
@@ -219,6 +229,7 @@ class JniBindings {
 	     new String[] {
 		 "jobject", "_object",
 	     },
+	     null,
 	     new Object[] {
 		 "return this->_object != _object;",
 	     })
@@ -228,6 +239,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     null,
 	     new Object[] {
 		 "env.DeleteLocalRef(_object);",
 		 "_object = NULL;"
@@ -239,6 +251,7 @@ class JniBindings {
 		 "::jnixx::env", "env",
 		 "jclass", "klass",
 	     },
+	     null,
 	     new Object[] {
 		 "return env.IsInstanceOf(_object, klass);",
 	     })
@@ -251,6 +264,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     "__attribute__((noreturn))",
 	     new Object[] {
 		 "env.Throw((jthrowable)_object);",
 	     })
@@ -260,6 +274,7 @@ class JniBindings {
 		 "::jnixx::env", "env",
 		 "const char*", "message",
 	     },
+	     "__attribute__((noreturn))",
 	     new Object[] {
 		 "env.ThrowNew(_class_(env), message);",
 		 "env.throwPendingException();",
@@ -275,6 +290,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     null,
 	     new Object[] {
 		 "return env.GetStringLength((jstring)_object);",
 	     })
@@ -287,6 +303,7 @@ class JniBindings {
 		 "::jnixx::env", "env",
 		 "const char*", "utf",
 	     },
+	     null,
 	     new Object[] {
 		 "return String(env, env.NewStringUTF(utf));",
 	     })
@@ -296,6 +313,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     null,
 	     new Object[] {
 		 "return env.GetStringUTFLength((jstring) _object);",
 	     })
@@ -305,6 +323,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     null,
 	     new Object[] {
 		 "return env.GetStringUTFChars((jstring)_object, NULL);",
 	     })
@@ -315,6 +334,7 @@ class JniBindings {
 		 "::jnixx::env", "env",
 		 "const char *", "utf",
 	     },
+	     null,
 	     new Object[] {
 		 "env.ReleaseStringUTFChars((jstring)_object, utf);",
 	     })
@@ -328,6 +348,7 @@ class JniBindings {
 		 "jsize", "len", 
 		 "char*", "buf",
 	     },
+	     null,
 	     new Object[] {
 		 "env.GetStringUTFRegion((jstring)_object, start, len, buf);",
 	     })
@@ -356,6 +377,7 @@ class JniBindings {
 		     new String[] {
 			 "::jnixx::env", "env",
 		     },
+		     null,
 		     new Object[] {
 			 "return env.GetArrayLength((j" + type + "Array) _object);"
 		     })
@@ -365,6 +387,7 @@ class JniBindings {
 			 "::jnixx::env", "env",
 			 "jsize", "length",
 		     },
+		     null,
 		     new Object[] {
 			 "return " + type + "Array(env, env.New" + Type + "Array(length));",
 		     })
@@ -374,6 +397,7 @@ class JniBindings {
 			 "::jnixx::env", "env",
 			 "jboolean*", "isCopy",
 		     },
+		     null,
 		     new Object[] {
 			 "return env.Get" + Type + "ArrayElements((j" + type + "Array) _object, isCopy);"
 		     })
@@ -384,6 +408,7 @@ class JniBindings {
 			 "j" + type + "*", "elements",
 			 "jint", "mode"
 		     },
+		     null,
 		     new Object[] {
 			 "env.Release" + Type + "ArrayElements((j" + type + "Array)_object, elements, mode);",
 		     })
@@ -395,6 +420,7 @@ class JniBindings {
 			 "jsize", "length",
 			 "j" + type + "*", "buf",
 		     },
+		     null,
 		     new Object[] {
 			 "env.Get" + Type + "ArrayRegion((j" + type + "Array) _object, start, length, buf);"
 		     })
@@ -406,6 +432,7 @@ class JniBindings {
 			 "jsize", "length",
 			 "j" + type + "*", "buf",
 		     },
+		     null,
 		     new Object[] {
 			 "env.Set" + Type + "ArrayRegion((j" + type + "Array) _object, start, length, buf);"
 		     })
diff --git a/frysk-sys/jnixx/exceptions.cxx b/frysk-sys/jnixx/exceptions.cxx
index a190266..2531868 100644
--- a/frysk-sys/jnixx/exceptions.cxx
+++ b/frysk-sys/jnixx/exceptions.cxx
@@ -46,20 +46,75 @@
 #include "jni.hxx"
 
 #include "jnixx/exceptions.hxx"
+#include "jnixx/print.hxx"
+
+static void throwErrno(::jnixx::env& env, int error, const char *fmt, ...)
+  __attribute__((noreturn));
+void
+throwErrno(::jnixx::env& env, int error, const char *fmt, ...) {
+  va_list ap;
+  va_start(ap, fmt);
+  java::lang::String message = vajprintf(env, fmt, ap);
+  switch (error) {
+#ifdef EBADF
+  case EBADF:
+    frysk::sys::Errno$Ebadf::New(env, message).Throw(env);
+#endif
+#ifdef ENOMEM
+  case ENOMEM:
+    frysk::sys::Errno$Enomem::New(env, message).Throw(env);
+#endif
+#ifdef EFAULT
+  case EFAULT:
+    frysk::sys::Errno$Efault::New(env, message).Throw(env);
+#endif
+#ifdef EINVAL
+  case EINVAL:
+    frysk::sys::Errno$Einval::New(env, message).Throw(env);
+#endif
+#ifdef ESRCH
+  case ESRCH:
+    frysk::sys::Errno$Esrch::New(env, message).Throw(env);
+#endif
+#ifdef ECHILD
+  case ECHILD:
+    frysk::sys::Errno$Echild::New(env, message).Throw(env);
+#endif
+#ifdef EPERM
+  case EPERM:
+    frysk::sys::Errno$Eperm::New(env, message).Throw(env);
+#endif
+#ifdef EIO
+  case EIO:
+    frysk::sys::Errno$Eio::New(env, message).Throw(env);
+#endif
+#ifdef ENOENT
+  case ENOENT:
+    frysk::sys::Errno$Enoent::New(env, message).Throw(env);
+#endif
+  default:
+    frysk::sys::Errno::New(env, error, message).Throw(env);
+  }
+  va_end(ap);
+}
 
 void
 errnoException(::jnixx::env& env, int error, const char *prefix) {
   // Hack; for moment just throw something.
-  runtimeException(env, "not implemented: %s#%d#%s",
-		   __FILE__, __LINE__, __func__);
+  throwErrno(env, errno, "%s: %s", prefix, strerror(error));
 }
 
 void
 errnoException(::jnixx::env& env, int error, const char *prefix,
 	       const char *fmt, ...) {
-  // Hack; for moment just throw something.
-  runtimeException(env, "not implemented: %s#%d#%s",
-		   __FILE__, __LINE__, __func__);
+  va_list ap;
+  va_start(ap, fmt);
+  char message[256];
+  if (::snprintf(message, sizeof(message), fmt, ap) < 0) {
+    errnoException(env, errno, "malloc");
+  }
+  throwErrno(env, errno, "%s: %s (%s)", prefix, strerror(error), message);
+  va_end(ap);
 }
 
 void


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


                 reply	other threads:[~2008-05-20 20:36 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=20080520203601.22462.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).