diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2016-06-08 01:08:40 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-06-08 01:08:42 +0000 |
| commit | c02ba178985a5d7aa8372ed7f04b658de4ac1645 (patch) | |
| tree | f6ffa71b7fc86b71a5de8356ff98d936bb311587 /core/java/android | |
| parent | c9adac6abb4baa771a06e4c78b0feec3e916f730 (diff) | |
| parent | 29de4922dbfccbf1d6fd975a320f80ae7a28c7c4 (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.java | 16 |
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 { |
