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 {}
