Adds an optimization for checking whether a looper is stuck, with a new Looper method to see if its thread is currently idle. This will allow us to put a large number of loopers in the monitor efficiently, since we generally won't have to do a context switch on each of them (since most looper threads spend most of their time idle waiting for work). Also change things so the system process's main thread is actually running on the main thread. Because Jeff asked for this, and who am I to argue? :) Change-Id: I12999e6f9c4b056c22dd652cb78c2453c391061f
63 lines
1.9 KiB
Java
63 lines
1.9 KiB
Java
/*
|
|
* Copyright (C) 2013 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.server;
|
|
|
|
import android.os.Handler;
|
|
import android.os.HandlerThread;
|
|
|
|
/**
|
|
* Shared singleton I/O thread for the system. This is a thread for non-background
|
|
* service operations that can potential block briefly on network IO operations
|
|
* (not waiting for data itself, but communicating with network daemons).
|
|
*/
|
|
public final class IoThread extends HandlerThread {
|
|
private static IoThread sInstance;
|
|
private static Handler sHandler;
|
|
|
|
private IoThread() {
|
|
super("android.io", android.os.Process.THREAD_PRIORITY_DEFAULT);
|
|
}
|
|
|
|
private static void ensureThreadLocked() {
|
|
if (sInstance == null) {
|
|
sInstance = new IoThread();
|
|
sInstance.start();
|
|
sHandler = new Handler(sInstance.getLooper());
|
|
sHandler.post(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
android.os.Process.setCanSelfBackground(false);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
public static IoThread get() {
|
|
synchronized (IoThread.class) {
|
|
ensureThreadLocked();
|
|
return sInstance;
|
|
}
|
|
}
|
|
|
|
public static Handler getHandler() {
|
|
synchronized (IoThread.class) {
|
|
ensureThreadLocked();
|
|
return sHandler;
|
|
}
|
|
}
|
|
}
|