diff options
author | Dianne Hackborn <hackbod@google.com> | 2011-04-07 15:11:57 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2011-05-13 18:38:19 -0700 |
commit | 9a84983a9fd9959671e102045eaf185b83291269 (patch) | |
tree | 7235da3c8ad520b16425fee7984cbcd0cacf9b0b /core/jni | |
parent | f9dd34f4d3203fd50363b3b0247c5d0db6fe2c8f (diff) | |
download | frameworks_base-9a84983a9fd9959671e102045eaf185b83291269.zip frameworks_base-9a84983a9fd9959671e102045eaf185b83291269.tar.gz frameworks_base-9a84983a9fd9959671e102045eaf185b83291269.tar.bz2 |
DO NOT MERGE. Integrate from master: 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: I99447b87f77a701af52aeca984d93dfe931f065d
Diffstat (limited to 'core/jni')
-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 9e00a7d..df272a7 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -1500,7 +1500,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); @@ -1512,6 +1536,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); @@ -1522,6 +1550,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); @@ -1726,6 +1758,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}, |