summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2016-06-08 01:08:40 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-06-08 01:08:42 +0000
commitc02ba178985a5d7aa8372ed7f04b658de4ac1645 (patch)
treef6ffa71b7fc86b71a5de8356ff98d936bb311587 /core/java/android
parentc9adac6abb4baa771a06e4c78b0feec3e916f730 (diff)
parent29de4922dbfccbf1d6fd975a320f80ae7a28c7c4 (diff)
Merge "Duplicate file descriptor when dumping asynchronously." into nyc-dev
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/app/ActivityThread.java16
1 files changed, 13 insertions, 3 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 7198146bee0f..b220b2e23732 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1166,12 +1166,22 @@ public final class ActivityThread {
@Override
public void dumpDbInfo(final FileDescriptor fd, final String[] args) {
if (mSystemThread) {
- // Ensure this invocation is asynchronous to prevent
- // writer waiting due to buffer cannot be consumed.
+ // Ensure this invocation is asynchronous to prevent writer waiting if buffer cannot
+ // be consumed. But it must duplicate the file descriptor first, since caller might
+ // be closing it.
+ final ParcelFileDescriptor dup;
+ try {
+ dup = ParcelFileDescriptor.dup(fd);
+ } catch (IOException e) {
+ Log.w(TAG, "Could not dup FD " + fd.getInt$());
+ return;
+ }
+
AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
@Override
public void run() {
- dumpDatabaseInfo(fd, args);
+ dumpDatabaseInfo(dup.getFileDescriptor(), args);
+ IoUtils.closeQuietly(dup);
}
});
} else {