oxipng/doc/src/crossbeam/mem/epoch/atomic.rs.html
2016-05-04 10:41:29 -04:00

468 lines
No EOL
30 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="Source to the Rust file `/Users/holmerj/.cargo/registry/src/github.com-88ac128001ac3a9a/crossbeam-0.2.9/src/mem/epoch/atomic.rs`.">
<meta name="keywords" content="rust, rustlang, rust-lang">
<title>atomic.rs.html -- source</title>
<link rel="stylesheet" type="text/css" href="../../../../rustdoc.css">
<link rel="stylesheet" type="text/css" href="../../../../main.css">
</head>
<body class="rustdoc">
<!--[if lte IE 8]>
<div class="warning">
This old browser is unsupported and will most likely display funky
things.
</div>
<![endif]-->
<nav class="sidebar">
</nav>
<nav class="sub">
<form class="search-form js-only">
<div class="search-container">
<input class="search-input" name="search"
autocomplete="off"
placeholder="Click or press S to search, ? for more options…"
type="search">
</div>
</form>
</nav>
<section id='main' class="content source"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
</pre><pre class='rust '>
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>marker</span>::<span class='ident'>PhantomData</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>mem</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>ptr</span>;
<span class='kw'>use</span> <span class='ident'>std</span>::<span class='ident'>sync</span>::<span class='ident'>atomic</span>::{<span class='self'>self</span>, <span class='ident'>Ordering</span>};
<span class='kw'>use</span> <span class='kw'>super</span>::{<span class='ident'>Owned</span>, <span class='ident'>Shared</span>, <span class='ident'>Guard</span>};
<span class='doccomment'>/// Like `std::sync::atomic::AtomicPtr`.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// Provides atomic access to a (nullable) pointer of type `T`, interfacing with</span>
<span class='doccomment'>/// the `Owned` and `Shared` types.</span>
<span class='kw'>pub</span> <span class='kw'>struct</span> <span class='ident'>Atomic</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='ident'>ptr</span>: <span class='ident'>atomic</span>::<span class='ident'>AtomicPtr</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>,
<span class='ident'>_marker</span>: <span class='ident'>PhantomData</span><span class='op'>&lt;</span><span class='op'>*</span><span class='kw'>const</span> ()<span class='op'>&gt;</span>,
}
<span class='kw'>unsafe</span> <span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Sync</span><span class='op'>&gt;</span> <span class='ident'>Send</span> <span class='kw'>for</span> <span class='ident'>Atomic</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {}
<span class='kw'>unsafe</span> <span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span>: <span class='ident'>Sync</span><span class='op'>&gt;</span> <span class='ident'>Sync</span> <span class='kw'>for</span> <span class='ident'>Atomic</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {}
<span class='kw'>fn</span> <span class='ident'>opt_shared_into_raw</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='ident'>val</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>T</span> {
<span class='ident'>val</span>.<span class='ident'>map</span>(<span class='op'>|</span><span class='ident'>p</span><span class='op'>|</span> <span class='ident'>p</span>.<span class='ident'>as_raw</span>()).<span class='ident'>unwrap_or</span>(<span class='ident'>ptr</span>::<span class='ident'>null_mut</span>())
}
<span class='kw'>fn</span> <span class='ident'>opt_owned_as_raw</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='ident'>val</span>: <span class='kw-2'>&amp;</span><span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Owned</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>T</span> {
<span class='ident'>val</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='ident'>Owned</span>::<span class='ident'>as_raw</span>).<span class='ident'>unwrap_or</span>(<span class='ident'>ptr</span>::<span class='ident'>null_mut</span>())
}
<span class='kw'>fn</span> <span class='ident'>opt_owned_into_raw</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>(<span class='ident'>val</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Owned</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>) <span class='op'>-&gt;</span> <span class='op'>*</span><span class='kw-2'>mut</span> <span class='ident'>T</span> {
<span class='kw'>let</span> <span class='ident'>ptr</span> <span class='op'>=</span> <span class='ident'>val</span>.<span class='ident'>as_ref</span>().<span class='ident'>map</span>(<span class='ident'>Owned</span>::<span class='ident'>as_raw</span>).<span class='ident'>unwrap_or</span>(<span class='ident'>ptr</span>::<span class='ident'>null_mut</span>());
<span class='ident'>mem</span>::<span class='ident'>forget</span>(<span class='ident'>val</span>);
<span class='ident'>ptr</span>
}
<span class='kw'>impl</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> <span class='ident'>Atomic</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='doccomment'>/// Create a new, null atomic pointer.</span>
<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;nightly&quot;</span>)]</span>
<span class='kw'>pub</span> <span class='kw'>const</span> <span class='kw'>fn</span> <span class='ident'>null</span>() <span class='op'>-&gt;</span> <span class='ident'>Atomic</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='ident'>Atomic</span> {
<span class='ident'>ptr</span>: <span class='ident'>atomic</span>::<span class='ident'>AtomicPtr</span>::<span class='ident'>new</span>(<span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> _),
<span class='ident'>_marker</span>: <span class='ident'>PhantomData</span>
}
}
<span class='attribute'>#[<span class='ident'>cfg</span>(<span class='ident'>not</span>(<span class='ident'>feature</span> <span class='op'>=</span> <span class='string'>&quot;nightly&quot;</span>))]</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>null</span>() <span class='op'>-&gt;</span> <span class='ident'>Atomic</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='ident'>Atomic</span> {
<span class='ident'>ptr</span>: <span class='ident'>atomic</span>::<span class='ident'>AtomicPtr</span>::<span class='ident'>new</span>(<span class='number'>0</span> <span class='kw'>as</span> <span class='op'>*</span><span class='kw-2'>mut</span> _),
<span class='ident'>_marker</span>: <span class='ident'>PhantomData</span>
}
}
<span class='doccomment'>/// Create a new atomic pointer</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>new</span>(<span class='ident'>data</span>: <span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>Atomic</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span> {
<span class='ident'>Atomic</span> {
<span class='ident'>ptr</span>: <span class='ident'>atomic</span>::<span class='ident'>AtomicPtr</span>::<span class='ident'>new</span>(<span class='ident'>Box</span>::<span class='ident'>into_raw</span>(<span class='ident'>Box</span>::<span class='ident'>new</span>(<span class='ident'>data</span>))),
<span class='ident'>_marker</span>: <span class='ident'>PhantomData</span>
}
}
<span class='doccomment'>/// Do an atomic load with the given memory ordering.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// In order to perform the load, we must pass in a borrow of a</span>
<span class='doccomment'>/// `Guard`. This is a way of guaranteeing that the thread has pinned the</span>
<span class='doccomment'>/// epoch for the entire lifetime `&#39;a`. In return, you get an optional</span>
<span class='doccomment'>/// `Shared` pointer back (`None` if the `Atomic` is currently null), with</span>
<span class='doccomment'>/// lifetime tied to the guard.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// # Panics</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// Panics if `ord` is `Release` or `AcqRel`.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>load</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>ord</span>: <span class='ident'>Ordering</span>, _: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>Guard</span>) <span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>unsafe</span> { <span class='ident'>Shared</span>::<span class='ident'>from_raw</span>(<span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>load</span>(<span class='ident'>ord</span>)) }
}
<span class='doccomment'>/// Do an atomic store with the given memory ordering.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// Transfers ownership of the given `Owned` pointer, if any. Since no</span>
<span class='doccomment'>/// lifetime information is acquired, no `Guard` value is needed.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// # Panics</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// Panics if `ord` is `Acquire` or `AcqRel`.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>store</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>val</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Owned</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>ord</span>: <span class='ident'>Ordering</span>) {
<span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>store</span>(<span class='ident'>opt_owned_into_raw</span>(<span class='ident'>val</span>), <span class='ident'>ord</span>)
}
<span class='doccomment'>/// Do an atomic store with the given memory ordering, immediately yielding</span>
<span class='doccomment'>/// a shared reference to the pointer that was stored.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// Transfers ownership of the given `Owned` pointer, yielding a `Shared`</span>
<span class='doccomment'>/// reference to it. Since the reference is valid only for the curent epoch,</span>
<span class='doccomment'>/// it&#39;s lifetime is tied to a `Guard` value.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// # Panics</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// Panics if `ord` is `Acquire` or `AcqRel`.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>store_and_ref</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>val</span>: <span class='ident'>Owned</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>, <span class='ident'>ord</span>: <span class='ident'>Ordering</span>, _: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>Guard</span>)
<span class='op'>-&gt;</span> <span class='ident'>Shared</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span><span class='op'>&gt;</span>
{
<span class='kw'>unsafe</span> {
<span class='kw'>let</span> <span class='ident'>shared</span> <span class='op'>=</span> <span class='ident'>Shared</span>::<span class='ident'>from_owned</span>(<span class='ident'>val</span>);
<span class='self'>self</span>.<span class='ident'>store_shared</span>(<span class='prelude-val'>Some</span>(<span class='ident'>shared</span>), <span class='ident'>ord</span>);
<span class='ident'>shared</span>
}
}
<span class='doccomment'>/// Do an atomic store of a `Shared` pointer with the given memory ordering.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// This operation does not require a guard, because it does not yield any</span>
<span class='doccomment'>/// new information about the lifetime of a pointer.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// # Panics</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// Panics if `ord` is `Acquire` or `AcqRel`.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>store_shared</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>val</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>ord</span>: <span class='ident'>Ordering</span>) {
<span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>store</span>(<span class='ident'>opt_shared_into_raw</span>(<span class='ident'>val</span>), <span class='ident'>ord</span>)
}
<span class='doccomment'>/// Do a compare-and-set from a `Shared` to an `Owned` pointer with the</span>
<span class='doccomment'>/// given memory ordering.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// As with `store`, this operation does not require a guard; it produces no new</span>
<span class='doccomment'>/// lifetime information. The `Result` indicates whether the CAS succeeded; if</span>
<span class='doccomment'>/// not, ownership of the `new` pointer is returned to the caller.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>cas</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>old</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>new</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Owned</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>ord</span>: <span class='ident'>Ordering</span>)
<span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span>(), <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Owned</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span><span class='op'>&gt;</span>
{
<span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>compare_and_swap</span>(<span class='ident'>opt_shared_into_raw</span>(<span class='ident'>old</span>),
<span class='ident'>opt_owned_as_raw</span>(<span class='kw-2'>&amp;</span><span class='ident'>new</span>),
<span class='ident'>ord</span>) <span class='op'>==</span> <span class='ident'>opt_shared_into_raw</span>(<span class='ident'>old</span>)
{
<span class='ident'>mem</span>::<span class='ident'>forget</span>(<span class='ident'>new</span>);
<span class='prelude-val'>Ok</span>(())
} <span class='kw'>else</span> {
<span class='prelude-val'>Err</span>(<span class='ident'>new</span>)
}
}
<span class='doccomment'>/// Do a compare-and-set from a `Shared` to an `Owned` pointer with the</span>
<span class='doccomment'>/// given memory ordering, immediatley acquiring a new `Shared` reference to</span>
<span class='doccomment'>/// the previously-owned pointer if successful.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// This operation is analogous to `store_and_ref`.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>cas_and_ref</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>old</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>new</span>: <span class='ident'>Owned</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;</span>,
<span class='ident'>ord</span>: <span class='ident'>Ordering</span>, _: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>Guard</span>)
<span class='op'>-&gt;</span> <span class='prelude-ty'>Result</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span><span class='op'>&gt;</span>, <span class='ident'>Owned</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>
{
<span class='kw'>if</span> <span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>compare_and_swap</span>(<span class='ident'>opt_shared_into_raw</span>(<span class='ident'>old</span>), <span class='ident'>new</span>.<span class='ident'>as_raw</span>(), <span class='ident'>ord</span>)
<span class='op'>==</span> <span class='ident'>opt_shared_into_raw</span>(<span class='ident'>old</span>)
{
<span class='prelude-val'>Ok</span>(<span class='kw'>unsafe</span> { <span class='ident'>Shared</span>::<span class='ident'>from_owned</span>(<span class='ident'>new</span>) })
} <span class='kw'>else</span> {
<span class='prelude-val'>Err</span>(<span class='ident'>new</span>)
}
}
<span class='doccomment'>/// Do a compare-and-set from a `Shared` to another `Shared` pointer with</span>
<span class='doccomment'>/// the given memory ordering.</span>
<span class='doccomment'>///</span>
<span class='doccomment'>/// The boolean return value is `true` when the CAS is successful.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>cas_shared</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>old</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>new</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>ord</span>: <span class='ident'>Ordering</span>)
<span class='op'>-&gt;</span> <span class='ident'>bool</span>
{
<span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>compare_and_swap</span>(<span class='ident'>opt_shared_into_raw</span>(<span class='ident'>old</span>),
<span class='ident'>opt_shared_into_raw</span>(<span class='ident'>new</span>),
<span class='ident'>ord</span>) <span class='op'>==</span> <span class='ident'>opt_shared_into_raw</span>(<span class='ident'>old</span>)
}
<span class='doccomment'>/// Do an atomic swap with an `Owned` pointer with the given memory ordering.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>swap</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>new</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Owned</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>ord</span>: <span class='ident'>Ordering</span>, _: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>Guard</span>)
<span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>unsafe</span> { <span class='ident'>Shared</span>::<span class='ident'>from_raw</span>(<span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>swap</span>(<span class='ident'>opt_owned_into_raw</span>(<span class='ident'>new</span>), <span class='ident'>ord</span>)) }
}
<span class='doccomment'>/// Do an atomic swap with a `Shared` pointer with the given memory ordering.</span>
<span class='kw'>pub</span> <span class='kw'>fn</span> <span class='ident'>swap_shared</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span><span class='op'>&gt;</span>(<span class='kw-2'>&amp;</span><span class='self'>self</span>, <span class='ident'>new</span>: <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='ident'>T</span><span class='op'>&gt;&gt;</span>, <span class='ident'>ord</span>: <span class='ident'>Ordering</span>, _: <span class='kw-2'>&amp;</span><span class='lifetime'>&#39;a</span> <span class='ident'>Guard</span>)
<span class='op'>-&gt;</span> <span class='prelude-ty'>Option</span><span class='op'>&lt;</span><span class='ident'>Shared</span><span class='op'>&lt;</span><span class='lifetime'>&#39;a</span>, <span class='ident'>T</span><span class='op'>&gt;&gt;</span> {
<span class='kw'>unsafe</span> { <span class='ident'>Shared</span>::<span class='ident'>from_raw</span>(<span class='self'>self</span>.<span class='ident'>ptr</span>.<span class='ident'>swap</span>(<span class='ident'>opt_shared_into_raw</span>(<span class='ident'>new</span>), <span class='ident'>ord</span>)) }
}
}
</pre>
</section>
<section id='search' class="content hidden"></section>
<section class="footer"></section>
<aside id="help" class="hidden">
<div>
<h1 class="hidden">Help</h1>
<div class="shortcuts">
<h2>Keyboard Shortcuts</h2>
<dl>
<dt>?</dt>
<dd>Show this help dialog</dd>
<dt>S</dt>
<dd>Focus the search field</dd>
<dt>&larrb;</dt>
<dd>Move up in search results</dd>
<dt>&rarrb;</dt>
<dd>Move down in search results</dd>
<dt>&#9166;</dt>
<dd>Go to active search result</dd>
</dl>
</div>
<div class="infos">
<h2>Search Tricks</h2>
<p>
Prefix searches with a type followed by a colon (e.g.
<code>fn:</code>) to restrict the search to a given type.
</p>
<p>
Accepted types are: <code>fn</code>, <code>mod</code>,
<code>struct</code>, <code>enum</code>,
<code>trait</code>, <code>type</code>, <code>macro</code>,
and <code>const</code>.
</p>
<p>
Search functions by type signature (e.g.
<code>vec -> usize</code> or <code>* -> vec</code>)
</p>
</div>
</div>
</aside>
<script>
window.rootPath = "../../../../";
window.currentCrate = "crossbeam";
window.playgroundUrl = "";
</script>
<script src="../../../../jquery.js"></script>
<script src="../../../../main.js"></script>
<script defer src="../../../../search-index.js"></script>
</body>
</html>