Merge "Ensure to complete background thread of PipeManager." into nyc-dev

This commit is contained in:
Daichi Hirono
2016-03-07 04:54:06 +00:00
committed by Android (Google) Code Review
3 changed files with 22 additions and 4 deletions

View File

@@ -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 {

View File

@@ -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);
} }
} }

View File

@@ -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(