This repository has been archived on 2022-04-04. You can view files and clone it, but cannot push or open issues or pull requests.

54 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="This library exposes a low-level API for creating your own efficient synchronization primitives."><meta name="keywords" content="rust, rustlang, rust-lang, parking_lot_core"><title>parking_lot_core - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../normalize.css"><link rel="stylesheet" type="text/css" href="../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../dark.css" disabled><link rel="stylesheet" type="text/css" href="../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../storage.js"></script><script src="../crates.js"></script><script defer src="../main.js"></script>
<noscript><link rel="stylesheet" href="../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../favicon.svg"></head><body class="rustdoc mod crate"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">&#9776;</div><a class="sidebar-logo" href="../parking_lot_core/index.html"><div class="logo-container"><img class="rust-logo" src="../rust-logo.png" alt="logo"></div>
</a><h2 class="location">Crate parking_lot_core</h2><div class="block version"><div class="narrow-helper"></div><p>Version 0.9.1</p></div><div class="sidebar-elems"><a id="all-types" href="all.html"><p>See all parking_lot_core's items</p></a><div class="block items"><ul><li><a href="#modules">Modules</a></li><li><a href="#structs">Structs</a></li><li><a href="#enums">Enums</a></li><li><a href="#constants">Constants</a></li><li><a href="#functions">Functions</a></li></ul></div><div id="sidebar-vars" data-name="parking_lot_core" data-ty="mod" data-relpath=""></div><script defer src="sidebar-items.js"></script></div></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../parking_lot_core/index.html"><img class="rust-logo" src="../rust-logo.png" alt="logo"></a><nav class="sub"><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="18" height="18" alt="Pick another theme!" src="../brush.svg"></button><div id="theme-choices" role="menu"></div></div><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../settings.html" title="settings"><img width="18" height="18" alt="Change settings" src="../wheel.svg"></a></div></form></nav></div><section id="main-content" class="content"><h1 class="fqn"><span class="in-band">Crate <a class="mod" href="#">parking_lot_core</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../clipboard.svg" width="19" height="18" alt="Copy item path"></button></span><span class="out-of-band"><span id="render-detail"><a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">&#x2212;</span>]</a></span><a class="srclink" href="../src/parking_lot_core/lib.rs.html#8-67" title="goto source code">[src]</a></span></h1><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>This library exposes a low-level API for creating your own efficient
synchronization primitives.</p>
<h2 id="the-parking-lot" class="section-header"><a href="#the-parking-lot">The parking lot</a></h2>
<p>To keep synchronization primitives small, all thread queuing and suspending
functionality is offloaded to the <em>parking lot</em>. The idea behind this is based
on the Webkit <a href="https://webkit.org/blog/6161/locking-in-webkit/"><code>WTF::ParkingLot</code></a>
class, which essentially consists of a hash table mapping of lock addresses
to queues of parked (sleeping) threads. The Webkit parking lot was itself
inspired by Linux <a href="http://man7.org/linux/man-pages/man2/futex.2.html">futexes</a>,
but it is more powerful since it allows invoking callbacks while holding a
queue lock.</p>
<p>There are two main operations that can be performed on the parking lot:</p>
<ul>
<li><em>Parking</em> refers to suspending the thread while simultaneously enqueuing it
on a queue keyed by some address.</li>
<li><em>Unparking</em> refers to dequeuing a thread from a queue keyed by some address
and resuming it.</li>
</ul>
<p>See the documentation of the individual functions for more details.</p>
<h2 id="building-custom-synchronization-primitives" class="section-header"><a href="#building-custom-synchronization-primitives">Building custom synchronization primitives</a></h2>
<p>Building custom synchronization primitives is very simple since the parking
lot takes care of all the hard parts for you. A simple example for a
custom primitive would be to integrate a <code>Mutex</code> inside another data type.
Since a mutex only requires 2 bits, it can share space with other data.
For example, one could create an <code>ArcMutex</code> type that combines the atomic
reference count and the two mutex bits in the same atomic word.</p>
</div></details><h2 id="modules" class="small-section-header"><a href="#modules">Modules</a></h2>
<div class="item-table"><div class="item-row"><div class="item-left module-item"><a class="mod" href="deadlock/index.html" title="parking_lot_core::deadlock mod">deadlock</a></div><div class="item-right docblock-short"><p>[Experimental] Deadlock detection</p>
</div></div></div><h2 id="structs" class="small-section-header"><a href="#structs">Structs</a></h2>
<div class="item-table"><div class="item-row"><div class="item-left module-item"><a class="struct" href="struct.ParkToken.html" title="parking_lot_core::ParkToken struct">ParkToken</a></div><div class="item-right docblock-short"><p>A value associated with a parked thread which can be used by <code>unpark_filter</code>.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="struct" href="struct.SpinWait.html" title="parking_lot_core::SpinWait struct">SpinWait</a></div><div class="item-right docblock-short"><p>A counter used to perform exponential backoff in spin loops.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="struct" href="struct.UnparkResult.html" title="parking_lot_core::UnparkResult struct">UnparkResult</a></div><div class="item-right docblock-short"><p>Result of an unpark operation.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="struct" href="struct.UnparkToken.html" title="parking_lot_core::UnparkToken struct">UnparkToken</a></div><div class="item-right docblock-short"><p>A value which is passed from an unparker to a parked thread.</p>
</div></div></div><h2 id="enums" class="small-section-header"><a href="#enums">Enums</a></h2>
<div class="item-table"><div class="item-row"><div class="item-left module-item"><a class="enum" href="enum.FilterOp.html" title="parking_lot_core::FilterOp enum">FilterOp</a></div><div class="item-right docblock-short"><p>Operation that <code>unpark_filter</code> should perform for each thread.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="enum" href="enum.ParkResult.html" title="parking_lot_core::ParkResult enum">ParkResult</a></div><div class="item-right docblock-short"><p>Result of a park operation.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="enum" href="enum.RequeueOp.html" title="parking_lot_core::RequeueOp enum">RequeueOp</a></div><div class="item-right docblock-short"><p>Operation that <code>unpark_requeue</code> should perform.</p>
</div></div></div><h2 id="constants" class="small-section-header"><a href="#constants">Constants</a></h2>
<div class="item-table"><div class="item-row"><div class="item-left module-item"><a class="constant" href="constant.DEFAULT_PARK_TOKEN.html" title="parking_lot_core::DEFAULT_PARK_TOKEN constant">DEFAULT_PARK_TOKEN</a></div><div class="item-right docblock-short"><p>A default park token to use.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="constant" href="constant.DEFAULT_UNPARK_TOKEN.html" title="parking_lot_core::DEFAULT_UNPARK_TOKEN constant">DEFAULT_UNPARK_TOKEN</a></div><div class="item-right docblock-short"><p>A default unpark token to use.</p>
</div></div></div><h2 id="functions" class="small-section-header"><a href="#functions">Functions</a></h2>
<div class="item-table"><div class="item-row"><div class="item-left module-item"><a class="fn" href="fn.park.html" title="parking_lot_core::park fn">park</a><a title="unsafe function" href="#"><sup></sup></a></div><div class="item-right docblock-short"><p>Parks the current thread in the queue associated with the given key.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="fn" href="fn.unpark_all.html" title="parking_lot_core::unpark_all fn">unpark_all</a><a title="unsafe function" href="#"><sup></sup></a></div><div class="item-right docblock-short"><p>Unparks all threads in the queue associated with the given key.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="fn" href="fn.unpark_filter.html" title="parking_lot_core::unpark_filter fn">unpark_filter</a><a title="unsafe function" href="#"><sup></sup></a></div><div class="item-right docblock-short"><p>Unparks a number of threads from the front of the queue associated with
<code>key</code> depending on the results of a filter function which inspects the
<code>ParkToken</code> associated with each thread.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="fn" href="fn.unpark_one.html" title="parking_lot_core::unpark_one fn">unpark_one</a><a title="unsafe function" href="#"><sup></sup></a></div><div class="item-right docblock-short"><p>Unparks one thread from the queue associated with the given key.</p>
</div></div><div class="item-row"><div class="item-left module-item"><a class="fn" href="fn.unpark_requeue.html" title="parking_lot_core::unpark_requeue fn">unpark_requeue</a><a title="unsafe function" href="#"><sup></sup></a></div><div class="item-right docblock-short"><p>Removes all threads from the queue associated with <code>key_from</code>, optionally
unparks the first one and requeues the rest onto the queue associated with
<code>key_to</code>.</p>
</div></div></div></section><section id="search" class="content hidden"></section></div></main><div id="rustdoc-vars" data-root-path="../" data-current-crate="parking_lot_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.59.0 (9d1b2106e 2022-02-23)" ></div>
</body></html>