diff options
Diffstat (limited to 'core/java/android/app/ActivityThread.java')
| -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 { |
