blob: dc43239f906fb29ac666444b4738d893e70ad10a [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 maintains a strictly nondecreasing lock held count on the current thread for any locks
* that were held prior to the method call. The same property must in general be true of all the
* methods it calls, which should themselves be annotated as {@code @ReleasesNoLocks} or a stronger
* annotation such as {@code @}{@link SideEffectFree}.
*
* <p>The method might acquire locks but then release them, or might acquire locks but not release
* them (in which case it should also be annotated with {@literal @}{@link EnsuresLockHeld} or
* {@literal @}{@link EnsuresLockHeldIf}).
*
* <p>This is the default for methods being type-checked that have no {@code @}{@link LockingFree},
* {@code @}{@link MayReleaseLocks}, {@code @}{@link SideEffectFree}, or {@code @}{@link Pure}
* annotation.
*
* <p>{@code @ReleasesNoLocks} provides a guarantee unlike {@code @}{@link MayReleaseLocks}, which
* provides no guarantees. However, {@code @ReleasesNoLocks} provides a weaker guarantee than
* {@code @}{@link LockingFree}.
*
* @see MayReleaseLocks
* @see LockingFree
* @see SideEffectFree
* @see Pure
* @checker_framework.manual #lock-checker Lock Checker
* @checker_framework.manual #lock-lockingfree-example Example use of @ReleasesNoLocks
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@InheritedAnnotation
public @interface ReleasesNoLocks {}