Dianne Hackborn efa92b2182 Cleanup some of the thread merging.
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
2013-05-07 15:33:26 -07:00

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