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: linkBe 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).