This is the mail archive of the frysk-cvs@sources.redhat.com mailing list for the frysk project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[SCM] master: Implement throwing of Errno.


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]