Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 29de4922 authored by Felipe Leme's avatar Felipe Leme
Browse files

Duplicate file descriptor when dumping asynchronously.

dumpDbInfo() uses an async task when dumping from the system thread, but
then the file descriptor is closed by the time the task is executed. As
such, the system databases are not dumped.

BUG: 29123428
Change-Id: Ibb8bbe503aa03c3ca13b2b1789f0ead0b869e9d5
parent a86d6c4d
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -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 {