1cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir/*
2cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * Copyright (C) 2017 The Android Open Source Project
3cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *
4cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * Licensed under the Apache License, Version 2.0 (the "License");
5cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * you may not use this file except in compliance with the License.
6cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * You may obtain a copy of the License at
7cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *
8cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *      http://www.apache.org/licenses/LICENSE-2.0
9cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *
10cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * Unless required by applicable law or agreed to in writing, software
11cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * distributed under the License is distributed on an "AS IS" BASIS,
12cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * See the License for the specific language governing permissions and
14cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * limitations under the License.
15cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir */
16cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.annotation;
18cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir
19cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinirimport java.lang.annotation.ElementType;
20cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinirimport java.lang.annotation.Retention;
21cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinirimport java.lang.annotation.RetentionPolicy;
22cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinirimport java.lang.annotation.Target;
23cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir
24cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir/**
25cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * Denotes that the annotated method or field can only be accessed when holding the referenced lock.
26cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * <p>
27cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * Example:
28cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * <pre>
29cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * final Object objectLock = new Object();
30cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *
31cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * {@literal @}GuardedBy("objectLock")
32cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * volatile Object object;
33cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *
34cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * Object getObject() {
35cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *     synchronized (objectLock) {
36cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *         if (object == null) {
37cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *             object = new Object();
38cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *         }
39cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *     }
40cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir *     return object;
41cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir * }</pre>
42cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir */
43cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir@Target({ ElementType.FIELD, ElementType.METHOD })
44cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir@Retention(RetentionPolicy.CLASS)
45cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinirpublic @interface GuardedBy {
46cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir    String value();
47cbff425f3fc50944b76cfd8ccf8f3b9f3e4eb914Siyamed Sinir}
48