diff options
author | Dianne Hackborn <hackbod@google.com> | 2011-04-07 15:11:57 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2011-04-07 18:26:15 -0700 |
commit | e17aeb31030cfeed339a39a107912ad5e9178390 (patch) | |
tree | e0773ea106c5504e2ef107a91f5871827cd76b75 /core/jni/android_util_Binder.cpp | |
parent | 097786507b07ff7137b305b5cf71b5ecbc6b029e (diff) | |
download | frameworks_base-e17aeb31030cfeed339a39a107912ad5e9178390.zip frameworks_base-e17aeb31030cfeed339a39a107912ad5e9178390.tar.gz frameworks_base-e17aeb31030cfeed339a39a107912ad5e9178390.tar.bz2 |
Improve activity manager debug dumps.
Activity manager now does all dump requests into apps
asynchronously, so it can nicely timeout if there is an
app problem. Also lots of general cleanup of the am
dump output.
Change-Id: Id0dbccffb217315aeb85c964e379833e6aa3f5af
Diffstat (limited to 'core/jni/android_util_Binder.cpp')
-rw-r--r-- | core/jni/android_util_Binder.cpp | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 09a5fd4..eb1c437 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -1509,7 +1509,31 @@ static jobject android_os_Parcel_openFileDescriptor(JNIEnv* env, jobject clazz, int fd = open(name8.string(), flags, realMode); if (fd < 0) { - jniThrowException(env, "java/io/FileNotFoundException", NULL); + jniThrowException(env, "java/io/FileNotFoundException", strerror(errno)); + return NULL; + } + jobject object = newFileDescriptor(env, fd); + if (object == NULL) { + close(fd); + } + return object; +} + +static jobject android_os_Parcel_dupFileDescriptor(JNIEnv* env, jobject clazz, jobject orig) +{ + if (orig == NULL) { + jniThrowException(env, "java/lang/NullPointerException", NULL); + return NULL; + } + int origfd = env->GetIntField(orig, gFileDescriptorOffsets.mDescriptor); + if (origfd < 0) { + jniThrowException(env, "java/lang/IllegalArgumentException", "bad FileDescriptor"); + return NULL; + } + + int fd = dup(origfd); + if (fd < 0) { + jniThrowException(env, "java/io/IOException", strerror(errno)); return NULL; } jobject object = newFileDescriptor(env, fd); @@ -1521,6 +1545,10 @@ static jobject android_os_Parcel_openFileDescriptor(JNIEnv* env, jobject clazz, static void android_os_Parcel_closeFileDescriptor(JNIEnv* env, jobject clazz, jobject object) { + if (object == NULL) { + jniThrowException(env, "java/lang/NullPointerException", NULL); + return; + } int fd = env->GetIntField(object, gFileDescriptorOffsets.mDescriptor); if (fd >= 0) { env->SetIntField(object, gFileDescriptorOffsets.mDescriptor, -1); @@ -1531,6 +1559,10 @@ static void android_os_Parcel_closeFileDescriptor(JNIEnv* env, jobject clazz, jo static void android_os_Parcel_clearFileDescriptor(JNIEnv* env, jobject clazz, jobject object) { + if (object == NULL) { + jniThrowException(env, "java/lang/NullPointerException", NULL); + return; + } int fd = env->GetIntField(object, gFileDescriptorOffsets.mDescriptor); if (fd >= 0) { env->SetIntField(object, gFileDescriptorOffsets.mDescriptor, -1); @@ -1735,6 +1767,7 @@ static const JNINativeMethod gParcelMethods[] = { {"readStrongBinder", "()Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder}, {"internalReadFileDescriptor", "()Ljava/io/FileDescriptor;", (void*)android_os_Parcel_readFileDescriptor}, {"openFileDescriptor", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_openFileDescriptor}, + {"dupFileDescriptor", "(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_dupFileDescriptor}, {"closeFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_closeFileDescriptor}, {"clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_clearFileDescriptor}, {"freeBuffer", "()V", (void*)android_os_Parcel_freeBuffer}, |