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
diff --git a/java/com/android/internal/annotations/CompositeRWLock.java b/java/com/android/internal/annotations/CompositeRWLock.java
new file mode 100644
index 0000000..b6ddfc4
--- /dev/null
+++ b/java/com/android/internal/annotations/CompositeRWLock.java
@@ -0,0 +1,47 @@
+/*
+ * 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 {};
+}
diff --git a/java/com/android/internal/annotations/GuardedBy.java b/java/com/android/internal/annotations/GuardedBy.java
index 0e63214..c05c4ab 100644
--- a/java/com/android/internal/annotations/GuardedBy.java
+++ b/java/com/android/internal/annotations/GuardedBy.java
@@ -16,7 +16,9 @@
 
 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.RetentionPolicy;
 import java.lang.annotation.Target;
@@ -25,8 +27,32 @@
  * Annotation type used to mark a method or field that can only be accessed when
  * holding the referenced locks.
  */
-@Target({ ElementType.FIELD, ElementType.METHOD })
+@Target({FIELD, METHOD})
 @Retention(RetentionPolicy.CLASS)
 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 {};
 }