summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYe Wen <ywen@google.com>2015-04-01 15:55:06 -0700
committerYe Wen <ywen@google.com>2015-04-02 14:47:43 -0700
commita167df730849cbd6fc23b4dce7a80d4268e90095 (patch)
tree970a5f9350651aa49efacf8b82c9271308e12e62
parentea412ac1ae9a6ca9a92f46958c07a5ed7786840b (diff)
downloadandroid_packages_services_Mms-a167df730849cbd6fc23b4dce7a80d4268e90095.tar.gz
android_packages_services_Mms-a167df730849cbd6fc23b4dce7a80d4268e90095.tar.bz2
android_packages_services_Mms-a167df730849cbd6fc23b4dce7a80d4268e90095.zip
Enable parallel MMS sending or downloading
Change-Id: I67d4c0fdd9f729417d8b5050f5c7c623138f40b8
-rw-r--r--src/com/android/mms/service/MmsService.java111
1 files changed, 45 insertions, 66 deletions
diff --git a/src/com/android/mms/service/MmsService.java b/src/com/android/mms/service/MmsService.java
index 3f33c73..eb6065f 100644
--- a/src/com/android/mms/service/MmsService.java
+++ b/src/com/android/mms/service/MmsService.java
@@ -29,11 +29,7 @@ import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
@@ -88,6 +84,9 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
// specific size limit should not be used (as it could be lower on some carriers).
private static final int MAX_MMS_FILE_SIZE = 8 * 1024 * 1024;
+ // The default number of threads allowed to run MMS requests in each queue
+ public static final int THREAD_POOL_SIZE = 4;
+
// Pending requests that are waiting for the SIM to be available
// If a different SIM is currently used by previous requests, the following
// requests will stay in this queue until that SIM finishes its current requests in
@@ -98,7 +97,8 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
// TODO: persist this in case MmsService crashes
private final Queue<MmsRequest> mPendingSimRequestQueue = new ArrayDeque<>();
- private final ExecutorService mExecutor = Executors.newCachedThreadPool();
+ // Thread pool for transferring PDU with MMS apps
+ private final ExecutorService mPduTransferExecutor = Executors.newCachedThreadPool();
// A cache of MmsNetworkManager for SIMs
private final SparseArray<MmsNetworkManager> mNetworkManagerCache = new SparseArray<>();
@@ -108,33 +108,10 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
// The current running MmsRequest count.
private int mRunningRequestCount;
- /**
- * A thread-based request queue for executing the MMS requests in serial order
- */
- private class RequestQueue extends Handler {
- public RequestQueue(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- final MmsRequest request = (MmsRequest) msg.obj;
- if (request != null) {
- try {
- request.execute(MmsService.this, getNetworkManager(request.getSubId()));
- } finally {
- synchronized (MmsService.this) {
- mRunningRequestCount--;
- if (mRunningRequestCount <= 0) {
- movePendingSimRequestsToRunningSynchronized();
- }
- }
- }
- } else {
- Log.e(TAG, "RequestQueue: handling empty request");
- }
- }
- }
+ // Running request queues, one thread pool per queue
+ // 0: send queue
+ // 1: download queue
+ private final ExecutorService[] mRunningRequestExecutors = new ExecutorService[2];
private MmsNetworkManager getNetworkManager(int subId) {
synchronized (mNetworkManagerCache) {
@@ -360,31 +337,6 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
}
};
- // Running request queues, one thread per queue
- // 0: send queue
- // 1: download queue
- private final RequestQueue[] mRunningRequestQueues = new RequestQueue[2];
-
- /**
- * Lazy start the request queue threads
- *
- * @param queueIndex index of the queue to start
- */
- private void startRequestQueueIfNeeded(int queueIndex) {
- if (queueIndex < 0 || queueIndex >= mRunningRequestQueues.length) {
- Log.e(TAG, "Start request queue if needed: invalid queue " + queueIndex);
- return;
- }
- synchronized (this) {
- if (mRunningRequestQueues[queueIndex] == null) {
- final HandlerThread thread =
- new HandlerThread("MmsService RequestQueue " + queueIndex);
- thread.start();
- mRunningRequestQueues[queueIndex] = new RequestQueue(thread.getLooper());
- }
- }
- }
-
@Override
public void addSimRequest(MmsRequest request) {
if (request == null) {
@@ -413,17 +365,32 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
}
}
- private void addToRunningRequestQueueSynchronized(MmsRequest request) {
+ private void addToRunningRequestQueueSynchronized(final MmsRequest request) {
Log.d(TAG, "Add request to running queue for subId " + request.getSubId());
// Update current state of running requests
- mCurrentSubId = request.getSubId();
+ final int queue = request.getQueueType();
+ if (queue < 0 || queue >= mRunningRequestExecutors.length) {
+ Log.e(TAG, "Invalid request queue index for running request");
+ return;
+ }
mRunningRequestCount++;
+ mCurrentSubId = request.getSubId();
// Send to the corresponding request queue for execution
- final int queue = request.getQueueType();
- startRequestQueueIfNeeded(queue);
- final Message message = Message.obtain();
- message.obj = request;
- mRunningRequestQueues[queue].sendMessage(message);
+ mRunningRequestExecutors[queue].execute(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ request.execute(MmsService.this, getNetworkManager(request.getSubId()));
+ } finally {
+ synchronized (MmsService.this) {
+ mRunningRequestCount--;
+ if (mRunningRequestCount <= 0) {
+ movePendingSimRequestsToRunningSynchronized();
+ }
+ }
+ }
+ }
+ });
}
private void movePendingSimRequestsToRunningSynchronized() {
@@ -464,12 +431,24 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
// Load mms_config
MmsConfigManager.getInstance().init(this);
// Initialize running request state
+ for (int i = 0; i < mRunningRequestExecutors.length; i++) {
+ mRunningRequestExecutors[i] = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
+ }
synchronized (this) {
mCurrentSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
mRunningRequestCount = 0;
}
}
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ Log.d(TAG, "onDestroy");
+ for (ExecutorService executor : mRunningRequestExecutors) {
+ executor.shutdown();
+ }
+ }
+
private Uri importSms(String address, int type, String text, long timestampMillis,
boolean seen, boolean read, String creator) {
Uri insertUri = null;
@@ -811,7 +790,7 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
}
};
- Future<byte[]> pendingResult = mExecutor.submit(copyPduToArray);
+ Future<byte[]> pendingResult = mPduTransferExecutor.submit(copyPduToArray);
try {
return pendingResult.get(TASK_TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (Exception e) {
@@ -853,7 +832,7 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
}
};
- Future<Boolean> pendingResult = mExecutor.submit(copyDownloadedPduToOutput);
+ Future<Boolean> pendingResult = mPduTransferExecutor.submit(copyDownloadedPduToOutput);
try {
return pendingResult.get(TASK_TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (Exception e) {