All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.android.os.ThreadLocalWorkSource Maven / Gradle / Ivy

Go to download

A library jar that provides APIs for Applications written for the Google Android Platform.

There is a newer version: 15-robolectric-12650502
Show newest version
/*
 * Copyright (C) 2018 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 android.os;

/**
 * Tracks who triggered the work currently executed on this thread.
 *
 * 

ThreadLocalWorkSource is automatically updated inside system server for incoming/outgoing * binder calls and messages posted to handler threads. * *

ThreadLocalWorkSource can also be set manually if needed to refine the WorkSource. * *

Example: *

    *
  • Bluetooth process calls {@link PowerManager#isInteractive()} API on behalf of app foo. *
  • ThreadLocalWorkSource will be automatically set to the UID of foo. *
  • Any code on the thread handling {@link PowerManagerService#isInteractive()} can call * {@link ThreadLocalWorkSource#getUid()} to blame any resource used to handle this call. *
  • If a message is posted from the binder thread, the code handling the message can also call * {@link ThreadLocalWorkSource#getUid()} and it will return the UID of foo since the work source is * automatically propagated. *
* * @hide Only for use within system server. */ public final class ThreadLocalWorkSource { public static final int UID_NONE = Message.UID_NONE; private static final ThreadLocal sWorkSourceUid = ThreadLocal.withInitial(() -> UID_NONE); /** * Returns the UID to blame for the code currently executed on this thread. * *

This UID is set automatically by common frameworks (e.g. Binder and Handler frameworks) * and automatically propagated inside system server. *

It can also be set manually using {@link #setUid(int)}. */ public static int getUid() { return sWorkSourceUid.get(); } /** * Sets the UID to blame for the code currently executed on this thread. * *

Inside system server, this UID will be automatically propagated. *

It will be used to attribute future resources used on this thread (e.g. binder * transactions or processing handler messages) and on any other threads the UID is propagated * to. * * @return a token that can be used to restore the state. */ public static long setUid(int uid) { final long token = getToken(); sWorkSourceUid.set(uid); return token; } /** * Restores the state using the provided token. */ public static void restore(long token) { sWorkSourceUid.set(parseUidFromToken(token)); } /** * Clears the stored work source uid. * *

This method should be used when we do not know who to blame. If the UID to blame is the * UID of the current process, it is better to attribute the work to the current process * explicitly instead of clearing the work source: * *

     * ThreadLocalWorkSource.setUid(Process.myUid());
     * 
* * @return a token that can be used to restore the state. **/ public static long clear() { return setUid(UID_NONE); } private static int parseUidFromToken(long token) { return (int) token; } private static long getToken() { return sWorkSourceUid.get(); } private ThreadLocalWorkSource() { } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy