summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2011-04-07 15:11:57 -0700
committerDianne Hackborn <hackbod@google.com>2011-05-13 18:38:19 -0700
commit9a84983a9fd9959671e102045eaf185b83291269 (patch)
tree7235da3c8ad520b16425fee7984cbcd0cacf9b0b /core/jni
parentf9dd34f4d3203fd50363b3b0247c5d0db6fe2c8f (diff)
downloadframeworks_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.cpp35
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},