blob: e9737ea034eec3f64f325a105e9a0c78c34806c4 [file] [log] [blame]
package org.checkerframework.checker.lock.qual;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.checkerframework.dataflow.qual.Pure;
import org.checkerframework.dataflow.qual.SideEffectFree;
import org.checkerframework.framework.qual.InheritedAnnotation;
/**
* The method neither acquires nor releases locks, nor do any of the methods that it calls. More
* specifically, the method is not {@code synchronized}, it contains no {@code synchronized} blocks,
* it contains no calls to {@code lock} or {@code unlock}, and it contains no calls to other
* non-{@code @LockingFree} methods.
*
* <p>{@code @LockingFree} provides a stronger guarantee than {@code @}{@link ReleasesNoLocks} and a
* weaker guarantee than {@code @}{@link SideEffectFree}.
*
* @see MayReleaseLocks
* @see ReleasesNoLocks
* @see SideEffectFree
* @see Pure
* @checker_framework.manual #lock-checker Lock Checker
* @checker_framework.manual #lock-lockingfree-example Example use of @LockingFree
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@InheritedAnnotation
public @interface LockingFree {}