This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
<!DOCTYPE html>
<htmlxmlns="http://www.w3.org/1999/xhtml"><head><title>StarvationDomain (infer.Concurrency.StarvationDomain)</title><linkrel="stylesheet"href="../../../odoc.css"/><metacharset="utf-8"/><metaname="generator"content="odoc 1.5.2"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><scriptsrc="../../../highlight.pack.js"></script><script>hljs.initHighlightingOnLoad();</script></head><body><divclass="content"><header><nav><ahref="../index.html">Up</a>–<ahref="../../index.html">infer</a>»<ahref="../index.html">Concurrency</a>» StarvationDomain</nav><h1>Module <code>Concurrency.StarvationDomain</code></h1></header><divclass="spec module"id="module-F"><ahref="#module-F"class="anchor"></a><code><spanclass="keyword">module</span> F = Stdlib.Format</code></div><dl><dtclass="spec module"id="module-ThreadDomain"><ahref="#module-ThreadDomain"class="anchor"></a><code><spanclass="keyword">module</span><ahref="ThreadDomain/index.html">ThreadDomain</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>Domain for thread-type. The main goals are</p></dd></dl><dl><dtclass="spec module"id="module-Lock"><ahref="#module-Lock"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Lock/index.html">Lock</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>Abstract address for a lock. There are two notions of equality:</p></dd></dl><divclass="spec module"id="module-VarDomain"><ahref="#module-VarDomain"class="anchor"></a><code><spanclass="keyword">module</span><ahref="VarDomain/index.html">VarDomain</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></div><divclass="spec module"id="module-Event"><ahref="#module-Event"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Event/index.html">Event</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></div><divclass="spec module"id="module-LockState"><ahref="#module-LockState"class="anchor"></a><code><spanclass="keyword">module</span><ahref="LockState/index.html">LockState</a> : <ahref="../../Absint/AbstractDomain/index.html#module-type-WithTop">Absint.AbstractDomain.WithTop</a></code></div><dl><dtclass="spec module"id="module-Acquisition"><ahref="#module-Acquisition"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Acquisition/index.html">Acquisition</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>a lock acquisition with location information</p></dd></dl><dl><dtclass="spec module"id="module-Acquisitions"><ahref="#module-Acquisitions"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Acquisitions/index.html">Acquisitions</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>A set of lock acquisitions with source locations and procnames.</p></dd></dl><dl><dtclass="spec module"id="module-CriticalPairElement"><ahref="#module-CriticalPairElement"class="anchor"></a><code><spanclass="keyword">module</span><ahref="CriticalPairElement/index.html">CriticalPairElement</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>An event and the currently-held locks at the time it occurred.</p></dd></dl><dl><dtclass="spec module"id="module-CriticalPair"><ahref="#module-CriticalPair"class="anchor"></a><code><spanclass="keyword">module</span><ahref="CriticalPair/index.html">CriticalPair</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>A <code>CriticalPairElement</code> equipped with a call stack. The intuition is that if we have a critical pair `(locks, event)` in the summary of a method then there is a trace of that method where `event` occurs, and right before it occurs the locks held are exactly `locks` (no over/under approximation). We call it "critical" because the information here alone determines deadlock conditions.</p></dd></dl><divclass="spec module"id="module-CriticalPairs"><ahref="#module-CriticalPairs"class="anchor"></a><code><spanclass="keyword">module</span> CriticalPairs : <ahref="../../Absint/AbstractDomain/index.html#module-type-FiniteSetS">Absint.AbstractDomain.FiniteSetS</a><spanclass="keyword">with</span><spanclass="keyword">type</span><ahref="../../Absint/AbstractDomain/index.html#module-type-FiniteSetS">FiniteSetS</a>.elt = <ahref="CriticalPair/index.html#type-t">CriticalPair.t</a></code></div><divclass="spec module"id="module-GuardToLockMap"><ahref="#module-GuardToLockMap"class="anchor"></a><code><spanclass="keyword">module</span><ahref="GuardToLockMap/index.html">GuardToLockMap</a> : <ahref="../../Absint/AbstractDomain/index.html#module-type-WithTop">Absint.AbstractDomain.WithTop</a></code></div><dl><dtclass="spec module"id="module-Attribute"><ahref="#module-Attribute"class="anchor"></a><code><spanclass="keyword">module</span><ahref="Attribute/index.html">Attribute</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>Tracks expression attributes</p></dd></dl><dl><dtclass="spec module"id="module-AttributeDomain"><ahref="#module-AttributeDomain"class="anchor"></a><code><spanclass="keyword">module</span><ahref="AttributeDomain/index.html">AttributeDomain</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>Tracks all expressions assigned values of <code>Attribute</code></p></dd></dl><dl><dtclass="spec module"id="module-ScheduledWorkItem"><ahref="#module-ScheduledWorkItem"class="anchor"></a><code><spanclass="keyword">module</span><ahref="ScheduledWorkItem/index.html">ScheduledWorkItem</a> : <spanclass="keyword">sig</span> ... <spanclass="keyword">end</span></code></dt><dd><p>A record of scheduled parallel work: the method scheduled to run, where, and on what thread.</p></dd></dl><divclass="spec module"id="module-ScheduledWorkDomain"><ahref="#module-ScheduledWorkDomain"class="anchor"></a><code><spanclass="keyword">module</span> ScheduledWorkDomain : <ahref="../../Absint/AbstractDomain/index.html#module-type-FiniteSetS">Absint.AbstractDomain.FiniteSetS</a><spanclass="keyword">with</span><spanclass="keyword">type</span><ahref="../../Absint/AbstractDomain/index.html#module-type-FiniteSetS">FiniteSetS</a>.elt = <ahref="ScheduledWorkItem/index.html#type-t">ScheduledWorkItem.t</a></code></div><dl><dtclass="spec type"id="type-t"><ahref="#type-t"class="anchor"></a><code><spanclass="keyword">type</span> t</code><code> = </code><code>{</code><tableclass="record"><trid="type-t.ignore_blocking_calls"class="anchored"><tdclass="def field"><ahref="#type-t.ignore_blocking_calls"class="anchor"></a><code>ignore_blocking_calls : bool;</code></td></tr><trid="type-t.guard_map"class="anchored"><tdclass="def field"><ahref="#type-t.guard_map"class="anchor"></a><code>guard_map : <ahref="GuardToLockMap/index.html#type-t">GuardToLockMap.t</a>;</code></td></tr><trid="type-t.lock_state"class="anchored"><tdclass="def field"><ahref="#type-t.lock_state"class="anchor"></a><code>lock_state : <ahref="LockState/index.html#type-t">LockState.t</a>;</code></td></tr><trid="type-t.critical_pairs"class="anchored"><tdclass="def field"><ahref="#type-t.critical_pairs"class="anchor"></a><code>critical_pairs : <ahref="index.html#module-CriticalPairs">CriticalPairs</a>.t;</code></td></tr><trid="type-t.attributes"class="anchored"><tdclass="def field"><ahref="#type-t.attributes"class="anchor"></a><code>attributes : <ahref="AttributeDomain/index.html#type-t">AttributeDomain.t</a>;</code></td></tr><trid="type-t.thread"class="anchored"><tdclass="def field"><ahref="#type-t.thread"class="anchor"></a><code>thread : <ahref="ThreadDomain/index.html#type-t">ThreadDomain.t</a>;</code></td></tr><trid="type-t.scheduled_work"class="anchored"><tdclass="def field"><ahref="#type-t.scheduled_work"class="anchor"></a><code>scheduled_work : <ahref="index.html#module-ScheduledWorkDomain">ScheduledWorkDomain</a>.t;</code></td></tr><trid="type-t.var_state"class="anchored"><tdclass="def field"><ahref="#type-t.var_state"class="anchor"></a><code>var_state : <ahref="VarDomain/index.html#type-t">VarDomain.t</a>;</code></td></tr></table><code>}</code></dt></dl><div><divclass="spec include"><divclass="doc"><detailsopen="open"><summary><spanclass="def"><code><spanclass="keyword">include</span><ahref="../../Absint/AbstractDomain/index.html#module-type-S">Absint.AbstractDomain.S</a><spanclass="keyword">with</span><spanclass="keyword">type</span><ahref="../../Absint/AbstractDomain/module-type-S/index.html#type-t">t</a> := <ahref="index.html#type-t">t</a></code></span></summary><div><divclass="spec include"><divclass="doc"><detailsopen="open"><summary><spanclass="def"><code><spanclass="keyword">include</span><ahref="../../Absint/AbstractDomain/index.html#module-type-NoJoin">Absint.AbstractDomain.NoJoin</a></code></span></summary><div><divclass="spec include"><divclass="doc"><detailsopen="open"><summary><spanclass="def"><code><spanclass="keyword">include</span><ahref="../../IStdlib/PrettyPrintable/index.html#module-type-PrintableType">IStdlib.PrettyPrintable.PrintableType</a></code></span></summary><dl><dtclass="spec type"id="type-t"><ahref="#type-t"class="anchor"></a><code><spanclass="keyword">type</span> t</code></dt></dl><dl><dtclass="spec value"id="val-pp"><ahref="#val-pp"class="anchor"></a><code><spanclass="keyword">val</span> pp : <ahref="../../IStdlib/PrettyPrintable/index.html#module-F">IStdlib.PrettyPrintable.F</a>.formatter <span>-></span><ahref="index.html#type-t">t</a><span>-></span> unit</code></dt></dl></details></div></div></div><dl><dtclass="spec value"id="val-leq"><ahref="#val-leq"class="anchor"></a><code><spanclass="keyword">val</span> leq : <span>lhs:<ahref="index.html#type-t">t</a></span><span>-></span><span>rhs:<ahref="index.html#type-t">t</a></span><span>-></span> bool</code></dt><dd><p>the implication relation: <code>lhs <= rhs</code> means <code>lhs |- rhs</code></p></dd></dl></details></div></div></div><dl><dtclass="spec value"id="val-join"><ahref="#val-join"class="anchor"></a><code><spanclass="keyword">val</span> join : <ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-widen"><ahref="#val-widen"class="anchor"></a><code><spanclass="keyword">val</span> widen : <span>prev:<ahref="index.html#type-t">t</a></span><span>-></span><span>next:<ahref="index.html#type-t">t</a></span><span>-></span><span>num_iters:int</span><span>-></span><ahref="index.html#type-t">t</a></code></dt></dl></details></div></div></div><dl><dtclass="spec value"id="val-initial"><ahref="#val-initial"class="anchor"></a><code><spanclass="keyword">val</span> initial : <ahref="index.html#type-t">t</a></code></dt><dd><p>initial domain state</p></dd></dl><dl><dtclass="spec value"id="val-acquire"><ahref="#val-acquire"class="anchor"></a><code><spanclass="keyword">val</span> acquire : <span>tenv:<ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><span>procname:<ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a></span><span>-></span><span>loc:<ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a></span><span>-></span><span><ahref="index.html#module-Lock">Lock</a>.t list</span><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>simultaneously acquire a number of locks, no-op if list is empty</p></dd></dl><dl><dtclass="spec value"id="val-release"><ahref="#val-release"class="anchor"></a><code><spanclass="keyword">val</span> release : <ahref="index.html#type-t">t</a><span>-></span><span><ahref="index.html#module-Lock">Lock</a>.t list</span><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>simultaneously release a number of locks, no-op if list is empty</p></dd></dl><dl><dtclass="spec value"id="val-blocking_call"><ahref="#val-blocking_call"class="anchor"></a><code><spanclass="keyword">val</span> blocking_call : <span>callee:<ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a></span><span>-></span><span>loc:<ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-ipc"><ahref="#val-ipc"class="anchor"></a><code><spanclass="keyword">val</span> ipc : <span>callee:<ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a></span><span>-></span><span>loc:<ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-wait_on_monitor"><ahref="#val-wait_on_monitor"class="anchor"></a><code><spanclass="keyword">val</span> wait_on_monitor : <span>loc:<ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a></span><span>-></span><ahref="../../Absint/FormalMap/index.html#type-t">Absint.FormalMap.t</a><span>-></span><span><ahref="../../Absint/HilExp/index.html#type-t">Absint.HilExp.t</a> list</span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-future_get"><ahref="#val-future_get"class="anchor"></a><code><spanclass="keyword">val</span> future_get : <span>callee:<ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a></span><span>-></span><span>loc:<ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a></span><span>-></span><span><ahref="../../Absint/HilExp/index.html#type-t">Absint.HilExp.t</a> list</span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-strict_mode_call"><ahref="#val-strict_mode_call"class="anchor"></a><code><spanclass="keyword">val</span> strict_mode_call : <span>callee:<ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a></span><span>-></span><span>loc:<ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-arbitrary_code_execution"><ahref="#val-arbitrary_code_execution"class="anchor"></a><code><spanclass="keyword">val</span> arbitrary_code_execution : <span>callee:<ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a></span><span>-></span><span>loc:<ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a></span><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-add_guard"><ahref="#val-add_guard"class="anchor"></a><code><spanclass="keyword">val</span> add_guard : <span>acquire_now:bool</span><span>-></span><span>procname:<ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a></span><span>-></span><span>loc:<ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a></span><span>-></span><ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="../../Absint/HilExp/index.html#type-t">Absint.HilExp.t</a><span>-></span><ahref="index.html#module-Lock">Lock</a>.t <span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>Install a mapping from the guard expression to the lock provided, and optionally lock it.</p></dd></dl><dl><dtclass="spec value"id="val-lock_guard"><ahref="#val-lock_guard"class="anchor"></a><code><spanclass="keyword">val</span> lock_guard : <span>procname:<ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a></span><span>-></span><span>loc:<ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a></span><span>-></span><ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="../../Absint/HilExp/index.html#type-t">Absint.HilExp.t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>Acquire the lock the guard was constructed with.</p></dd></dl><dl><dtclass="spec value"id="val-remove_guard"><ahref="#val-remove_guard"class="anchor"></a><code><spanclass="keyword">val</span> remove_guard : <ahref="index.html#type-t">t</a><span>-></span><ahref="../../Absint/HilExp/index.html#type-t">Absint.HilExp.t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>Destroy the guard and release its lock.</p></dd></dl><dl><dtclass="spec value"id="val-unlock_guard"><ahref="#val-unlock_guard"class="anchor"></a><code><spanclass="keyword">val</span> unlock_guard : <ahref="index.html#type-t">t</a><span>-></span><ahref="../../Absint/HilExp/index.html#type-t">Absint.HilExp.t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>Release the lock the guard was constructed with.</p></dd></dl><dl><dtclass="spec value"id="val-schedule_work"><ahref="#val-schedule_work"class="anchor"></a><code><spanclass="keyword">val</span> schedule_work : <ahref="../../IBase/Location/index.html#type-t">IBase.Location.t</a><span>-></span><ahref="../StarvationModels/index.html#type-scheduler_thread_constraint">StarvationModels.scheduler_thread_constraint</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="../../IR/Procname/index.html#type-t">IR.Procname.t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>record the fact that a method is scheduled to run on a certain thread/executor</p></dd></dl><dl><dtclass="spec type"id="type-summary"><ahref="#type-summary"class="anchor"></a><code><spanclass="keyword">type</span> summary</code><code> = </code><code>{</code><tableclass="record"><trid="type-summary.critical_pairs"class="anchored"><tdclass="def field"><ahref="#type-summary.critical_pairs"class="anchor"></a><code>critical_pairs : <ahref="index.html#module-CriticalPairs">CriticalPairs</a>.t;</code></td></tr><trid="type-summary.thread"class="anchored"><tdclass="def field"><ahref="#type-summary.thread"class="anchor"></a><code>thread : <ahref="ThreadDomain/index.html#type-t">ThreadDomain.t</a>;</code></td></tr><trid="type-summary.scheduled_work"class="anchored"><tdclass="def field"><ahref="#type-summary.scheduled_work"class="anchor"></a><code>scheduled_work : <ahref="index.html#module-ScheduledWorkDomain">ScheduledWorkDomain</a>.t;</code></td></tr><trid="type-summary.attributes"class="anchored"><tdclass="def field"><ahref="#type-summary.attributes"class="anchor"></a><code>attributes : <ahref="AttributeDomain/index.html#type-t">AttributeDomain.t</a>;</code></td><tdclass="doc"><p>final-state attributes that affect instance variables only</p></td></tr><trid="type-summary.return_attribute"class="anchored"><tdclass="def field"><ahref="#type-summary.return_attribute"class="anchor"></a><code>return_attribute : <ahref="Attribute/index.html#type-t">Attribute.t</a>;</code></td></tr></table><code>}</code></dt></dl><dl><dtclass="spec value"id="val-empty_summary"><ahref="#val-empty_summary"class="anchor"></a><code><spanclass="keyword">val</span> empty_summary : <ahref="index.html#type-summary">summary</a></code></dt><dtclass="spec value"id="val-pp_summary"><ahref="#val-pp_summary"class="anchor"></a><code><spanclass="keyword">val</span> pp_summary : <ahref="index.html#module-F">F</a>.formatter <span>-></span><ahref="index.html#type-summary">summary</a><span>-></span> unit</code></dt><dtclass="spec value"id="val-integrate_summary"><ahref="#val-integrate_summary"class="anchor"></a><code><spanclass="keyword">val</span> integrate_summary : <span>tenv:<ahref="../../IR/Tenv/index.html#type-t">IR.Tenv.t</a></span><span>-></span><span>lhs:<ahref="../../Absint/HilExp/AccessExpression/index.html#type-t">Absint.HilExp.AccessExpression.t</a></span><span>-></span><span>subst:<ahref="Lock/index.html#type-subst">Lock.subst</a></span><span>-></span><ahref="../../Absint/CallSite/index.html#type-t">Absint.CallSite.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-summary">summary</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dd><p>apply a callee summary to the current abstract state; <code>lhs</code> is the expression assigned the returned value, if any</p></dd></dl><dl><dtclass="spec value"id="val-summary_of_astate"><ahref="#val-summary_of_astate"class="anchor"></a><code><spanclass="keyword">val</span> summary_of_astate : <ahref="../../IR/Procdesc/index.html#type-t">IR.Procdesc.t</a><span>-></span><ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-summary">summary</a></code></dt><dtclass="spec value"id="val-set_ignore_blocking_calls_flag"><ahref="#val-set_ignore_blocking_calls_flag"class="anchor"></a><code><spanclass="keyword">val</span> set_ignore_blocking_calls_flag : <ahref="index.html#type-t">t</a><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-remove_dead_vars"><ahref="#val-remove_dead_vars"class="anchor"></a><code><spanclass="keyword">val</span> remove_dead_vars : <ahref="index.html#type-t">t</a><span>-></span><span><ahref="../../IR/Var/index.html#type-t">IR.Var.t</a> list</span><span>-></span><ahref="index.html#type-t">t</a></code></dt><dtclass="spec value"id="val-fold_critical_pairs_of_summary"><ahref="#val-fold_critical_pairs_of_summary"class="anchor"></a><code><spanclass="keyword">val</span> fold_critical_pairs_of_summary : <span>(<ahref="CriticalPair/index.html#type-t">CriticalPair.t</a><span>-></span><spanclass="type-var">'a</span><span>-></span><spanclass="type-var">'a</span>)</span><span>-></span><ahref="index.html#type-summary">summary</a><span>-></span><spanclass="type-var">'a</span><span>-></span><spanclass="type-var">'a</span></code></dt></dl></div></body></html>