diff options
author | Jeff Sharkey <jsharkey@android.com> | 2012-06-19 13:32:22 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2012-06-19 13:32:22 -0700 |
commit | 0abe556d28f5f5d395559cc6567b05939d1b2640 (patch) | |
tree | a6c328726c1f7cff8db804cb40742133147aae51 | |
parent | fe54cb6f3da7fe95d5141d97b0c6780e001ad058 (diff) | |
download | frameworks_base-0abe556d28f5f5d395559cc6567b05939d1b2640.zip frameworks_base-0abe556d28f5f5d395559cc6567b05939d1b2640.tar.gz frameworks_base-0abe556d28f5f5d395559cc6567b05939d1b2640.tar.bz2 |
Handle SCREEN_ON/OFF broadcasts without blocking.
NetworkPolicy currently uses a single background thread to process
various broadcasts. When processing other broadcasts, this thread
can block our handling of SCREEN_ON/OFF, which are sent as ordered
broadcasts.
This change moves SCREEN_ON/OFF handling to the main thread, and
dispatches a one-way message to the background thread, allowing the
ordered broadcast to always proceed.
Bug: 6677047
Change-Id: I52de2c7b75beb8059bb87e123689ba4a9c4ae349
-rw-r--r-- | services/java/com/android/server/net/NetworkPolicyManagerService.java | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java index d4e9cbc..fe43d11 100644 --- a/services/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java @@ -225,6 +225,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final int MSG_LIMIT_REACHED = 5; private static final int MSG_RESTRICT_BACKGROUND_CHANGED = 6; private static final int MSG_ADVISE_PERSIST_THRESHOLD = 7; + private static final int MSG_SCREEN_ON_CHANGED = 8; private final Context mContext; private final IActivityManager mActivityManager; @@ -349,7 +350,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final IntentFilter screenFilter = new IntentFilter(); screenFilter.addAction(Intent.ACTION_SCREEN_ON); screenFilter.addAction(Intent.ACTION_SCREEN_OFF); - mContext.registerReceiver(mScreenReceiver, screenFilter, null, mHandler); + mContext.registerReceiver(mScreenReceiver, screenFilter); // watch for network interfaces to be claimed final IntentFilter connFilter = new IntentFilter(CONNECTIVITY_ACTION_IMMEDIATE); @@ -411,7 +412,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { synchronized (mRulesLock) { // screen-related broadcasts are protected by system, no need // for permissions check. - updateScreenOn(); + mHandler.obtainMessage(MSG_SCREEN_ON_CHANGED).sendToTarget(); } } }; @@ -1878,6 +1879,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } return true; } + case MSG_SCREEN_ON_CHANGED: { + updateScreenOn(); + return true; + } default: { return false; } |