Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cfeb2866 authored by Jing Ji's avatar Jing Ji
Browse files

Add an additional lock in the ActivityManagerService

This CL breaks down the ProcessRecord by the characteristic of
the fields in it. It's a preparation for future CLs, to let
the various components in the ActivityManagerService to access
its own correlated data class only.

Also introduces an additional semi-global lock in the
ActivityManagerService as an effort to reduce the lock contentions.
Some of the data fields now requires either the legacy global lock
or this new lock to read from it, and both of the lock to write to it.

Bug: 162450085
Test: atest CtsAppTestCases
Test: atest FrameworksMockingServicesTests
Test: atest FrameworksServicesTests
Change-Id: I2718dfb8cd5c1852e81280ed11676c567f76d0a2
parent 670ffead
Loading
Loading
Loading
Loading
+47 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2021 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.internal.annotations;

import static java.lang.annotation.ElementType.FIELD;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Specifies a list of locks which are required for read/write operations on a data field.
 *
 * <p>
 * To annotate methods accessing the data field with the annotation {@link CompositeRWLock},
 * use {@link GuardedBy#value} to annotate method w/ write and/or read access to the data field,
 * use {@link GuardedBy#anyOf} to annotate method w/ read only access to the data field.
 * </p>
 *
 * <p>
 * When its {@link #value()} consists of multiple locks:
 * <ul>
 *   <li>To write to the protected data, acquire <b>all</b> of the locks
 *       in the order of the appearance in the {@link #value}.</li>
 *   <li>To read from the protected data, acquire any of the locks in the {@link #value}.</li>
 * </ul>
 * </p>
 */
@Target({FIELD})
@Retention(RetentionPolicy.CLASS)
public @interface CompositeRWLock {
    String[] value() default {};
}
+29 −3
Original line number Original line Diff line number Diff line
@@ -16,7 +16,9 @@


package com.android.internal.annotations;
package com.android.internal.annotations;


import java.lang.annotation.ElementType;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;

import java.lang.annotation.Retention;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.Target;
@@ -25,8 +27,32 @@ import java.lang.annotation.Target;
 * Annotation type used to mark a method or field that can only be accessed when
 * Annotation type used to mark a method or field that can only be accessed when
 * holding the referenced locks.
 * holding the referenced locks.
 */
 */
@Target({ ElementType.FIELD, ElementType.METHOD })
@Target({FIELD, METHOD})
@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.CLASS)
public @interface GuardedBy {
public @interface GuardedBy {
    String[] value();
    /**
     * Specifies a list of locks to be held in order to access the field/method
     * annotated with this; when used in conjunction with the {@link CompositeRWLock}, locks
     * should be acquired in the order of the appearance in the {@link #value} here.
     *
     * <p>
     * If specified, {@link #anyOf()} must be null.
     * </p>
     *
     * @see CompositeRWLock
     */
    String[] value() default {};

    /**
     * Specifies a list of locks where at least one of them must be held in order to access
     * the field/method annotated with this; it should be <em>only</em> used in the conjunction
     * with the {@link CompositeRWLock}.
     *
     * <p>
     * If specified, {@link #allOf()} must be null.
     * </p>
     *
     * @see CompositeRWLock
     */
    String[] anyOf() default {};
}
}
+3 −3
Original line number Original line Diff line number Diff line
@@ -158,9 +158,9 @@ java_genrule {
    srcs: [":services.core.unboosted"],
    srcs: [":services.core.unboosted"],
    tools: ["lockedregioncodeinjection"],
    tools: ["lockedregioncodeinjection"],
    cmd: "$(location lockedregioncodeinjection) " +
    cmd: "$(location lockedregioncodeinjection) " +
        "  --targets \"Lcom/android/server/am/ActivityManagerService;,Lcom/android/server/wm/WindowManagerGlobalLock;\" " +
        "  --targets \"Lcom/android/server/am/ActivityManagerService;,Lcom/android/server/am/ActivityManagerGlobalLock;,Lcom/android/server/wm/WindowManagerGlobalLock;\" " +
        "  --pre \"com/android/server/am/ActivityManagerService.boostPriorityForLockedSection,com/android/server/wm/WindowManagerService.boostPriorityForLockedSection\" " +
        "  --pre \"com/android/server/am/ActivityManagerService.boostPriorityForLockedSection,com/android/server/am/ActivityManagerService.boostPriorityForProcLockedSection,com/android/server/wm/WindowManagerService.boostPriorityForLockedSection\" " +
        "  --post \"com/android/server/am/ActivityManagerService.resetPriorityAfterLockedSection,com/android/server/wm/WindowManagerService.resetPriorityAfterLockedSection\" " +
        "  --post \"com/android/server/am/ActivityManagerService.resetPriorityAfterLockedSection,com/android/server/am/ActivityManagerService.resetPriorityAfterProcLockedSection,com/android/server/wm/WindowManagerService.resetPriorityAfterLockedSection\" " +
        "  -o $(out) " +
        "  -o $(out) " +
        "  -i $(in)",
        "  -i $(in)",
    out: ["services.core.priorityboosted.jar"],
    out: ["services.core.priorityboosted.jar"],
+4 −4
Original line number Original line Diff line number Diff line
@@ -22,8 +22,6 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.Slog;
import android.util.Slog;


import com.android.internal.os.BackgroundThread;

import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;


@@ -74,8 +72,9 @@ public class LockGuard {
    public static final int INDEX_PACKAGES = 3;
    public static final int INDEX_PACKAGES = 3;
    public static final int INDEX_STORAGE = 4;
    public static final int INDEX_STORAGE = 4;
    public static final int INDEX_WINDOW = 5;
    public static final int INDEX_WINDOW = 5;
    public static final int INDEX_ACTIVITY = 6;
    public static final int INDEX_PROC = 6;
    public static final int INDEX_DPMS = 7;
    public static final int INDEX_ACTIVITY = 7;
    public static final int INDEX_DPMS = 8;


    private static Object[] sKnownFixed = new Object[INDEX_DPMS + 1];
    private static Object[] sKnownFixed = new Object[INDEX_DPMS + 1];


@@ -229,6 +228,7 @@ public class LockGuard {
            case INDEX_PACKAGES: return "PACKAGES";
            case INDEX_PACKAGES: return "PACKAGES";
            case INDEX_STORAGE: return "STORAGE";
            case INDEX_STORAGE: return "STORAGE";
            case INDEX_WINDOW: return "WINDOW";
            case INDEX_WINDOW: return "WINDOW";
            case INDEX_PROC: return "PROCESS";
            case INDEX_ACTIVITY: return "ACTIVITY";
            case INDEX_ACTIVITY: return "ACTIVITY";
            case INDEX_DPMS: return "DPMS";
            case INDEX_DPMS: return "DPMS";
            default: return Integer.toString(index);
            default: return Integer.toString(index);
+255 −233

File changed.

Preview size limit exceeded, changes collapsed.

Loading