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

Commit 24ab92a5 authored by Daichi Hirono's avatar Daichi Hirono
Browse files

Ensure to complete background thread of PipeManager.

BUG=27488803

Change-Id: Ib540ab42f6263e1aea4c1bb184a4f88aa1454a14
parent 840c617c
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -440,7 +440,7 @@ public class MtpDocumentsProvider extends DocumentsProvider {
        if (DEBUG) {
        if (DEBUG) {
            Log.d(TAG, "Close device " + deviceId);
            Log.d(TAG, "Close device " + deviceId);
        }
        }
        getDeviceToolkit(deviceId).mDocumentLoader.close();
        getDeviceToolkit(deviceId).close();
        mDeviceToolkits.remove(deviceId);
        mDeviceToolkits.remove(deviceId);
        mMtpManager.closeDevice(deviceId);
        mMtpManager.closeDevice(deviceId);
        if (mDeviceToolkits.size() == 0) {
        if (mDeviceToolkits.size() == 0) {
@@ -496,7 +496,7 @@ public class MtpDocumentsProvider extends DocumentsProvider {
        return cursor;
        return cursor;
    }
    }


    private static class DeviceToolkit {
    private static class DeviceToolkit implements AutoCloseable {
        public final PipeManager mPipeManager;
        public final PipeManager mPipeManager;
        public final DocumentLoader mDocumentLoader;
        public final DocumentLoader mDocumentLoader;
        public final MtpDeviceRecord mDeviceRecord;
        public final MtpDeviceRecord mDeviceRecord;
@@ -509,6 +509,12 @@ public class MtpDocumentsProvider extends DocumentsProvider {
            mDocumentLoader = new DocumentLoader(record, manager, resolver, database);
            mDocumentLoader = new DocumentLoader(record, manager, resolver, database);
            mDeviceRecord = record;
            mDeviceRecord = record;
        }
        }

        @Override
        public void close() throws InterruptedException {
            mPipeManager.close();
            mDocumentLoader.close();
        }
    }
    }


    private class AppFuseCallback implements AppFuse.Callback {
    private class AppFuseCallback implements AppFuse.Callback {
+9 −2
Original line number Original line Diff line number Diff line
@@ -26,8 +26,14 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


class PipeManager {
class PipeManager {
    /**
     * Milliseconds we wait for background thread when pausing.
     */
    private final static long AWAIT_TERMINATION_TIMEOUT = 2000;

    final ExecutorService mExecutor;
    final ExecutorService mExecutor;
    final MtpDatabase mDatabase;
    final MtpDatabase mDatabase;


@@ -203,7 +209,8 @@ class PipeManager {
        }
        }
    }
    }


    void close() {
    boolean close() throws InterruptedException {
        mExecutor.shutdown();
        mExecutor.shutdownNow();
        return mExecutor.awaitTermination(AWAIT_TERMINATION_TIMEOUT, TimeUnit.MILLISECONDS);
    }
    }
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -45,6 +45,11 @@ public class PipeManagerTest extends AndroidTestCase {
        mPipeManager = new PipeManager(mDatabase, mExecutor);
        mPipeManager = new PipeManager(mDatabase, mExecutor);
    }
    }


    @Override
    protected void tearDown() throws Exception {
        assertTrue(mPipeManager.close());
    }

    public void testReadDocument_basic() throws Exception {
    public void testReadDocument_basic() throws Exception {
        mtpManager.setImportFileBytes(0, 1, HELLO_BYTES);
        mtpManager.setImportFileBytes(0, 1, HELLO_BYTES);
        final ParcelFileDescriptor descriptor = mPipeManager.readDocument(
        final ParcelFileDescriptor descriptor = mPipeManager.readDocument(