forked from diesel-rs/diesel
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlib.rs.html
More file actions
235 lines (225 loc) · 14.4 KB
/
Copy pathlib.rs.html
File metadata and controls
235 lines (225 loc) · 14.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
<!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 of the Rust file `/home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/lock_api-0.4.7/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.rs - source</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 defer src="../../source-script.js"></script><script defer src="../../source-files.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 source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../lock_api/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div>
</a><h2 class="location"></h2>
</nav>
<nav class="sidebar"><a class="sidebar-logo" href="../../lock_api/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div>
</a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../lock_api/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1">
<a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div>
</div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><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>
</pre><pre class="rust"><code><span class="comment">// Copyright 2018 Amanieu d'Antras</span>
<span class="comment">//</span>
<span class="comment">// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or</span>
<span class="comment">// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or</span>
<span class="comment">// http://opensource.org/licenses/MIT>, at your option. This file may not be</span>
<span class="comment">// copied, modified, or distributed except according to those terms.</span>
<span class="doccomment">//! This library provides type-safe and fully-featured `Mutex` and `RwLock`</span>
<span class="doccomment">//! types which wrap a simple raw mutex or rwlock type. This has several</span>
<span class="doccomment">//! benefits: not only does it eliminate a large portion of the work in</span>
<span class="doccomment">//! implementing custom lock types, it also allows users to write code which is</span>
<span class="doccomment">//! generic with regards to different lock implementations.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! Basic usage of this crate is very straightforward:</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! 1. Create a raw lock type. This should only contain the lock state, not any</span>
<span class="doccomment">//! data protected by the lock.</span>
<span class="doccomment">//! 2. Implement the `RawMutex` trait for your custom lock type.</span>
<span class="doccomment">//! 3. Export your mutex as a type alias for `lock_api::Mutex`, and</span>
<span class="doccomment">//! your mutex guard as a type alias for `lock_api::MutexGuard`.</span>
<span class="doccomment">//! See the [example](#example) below for details.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! This process is similar for RwLocks, except that two guards need to be</span>
<span class="doccomment">//! exported instead of one. (Or 3 guards if your type supports upgradable read</span>
<span class="doccomment">//! locks, see [extension traits](#extension-traits) below for details)</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! # Example</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! ```</span>
<span class="doccomment">//! use lock_api::{RawMutex, Mutex, GuardSend};</span>
<span class="doccomment">//! use std::sync::atomic::{AtomicBool, Ordering};</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! // 1. Define our raw lock type</span>
<span class="doccomment">//! pub struct RawSpinlock(AtomicBool);</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! // 2. Implement RawMutex for this type</span>
<span class="doccomment">//! unsafe impl RawMutex for RawSpinlock {</span>
<span class="doccomment">//! const INIT: RawSpinlock = RawSpinlock(AtomicBool::new(false));</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! // A spinlock guard can be sent to another thread and unlocked there</span>
<span class="doccomment">//! type GuardMarker = GuardSend;</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! fn lock(&self) {</span>
<span class="doccomment">//! // Note: This isn't the best way of implementing a spinlock, but it</span>
<span class="doccomment">//! // suffices for the sake of this example.</span>
<span class="doccomment">//! while !self.try_lock() {}</span>
<span class="doccomment">//! }</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! fn try_lock(&self) -> bool {</span>
<span class="doccomment">//! self.0</span>
<span class="doccomment">//! .compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)</span>
<span class="doccomment">//! .is_ok()</span>
<span class="doccomment">//! }</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! unsafe fn unlock(&self) {</span>
<span class="doccomment">//! self.0.store(false, Ordering::Release);</span>
<span class="doccomment">//! }</span>
<span class="doccomment">//! }</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! // 3. Export the wrappers. This are the types that your users will actually use.</span>
<span class="doccomment">//! pub type Spinlock<T> = lock_api::Mutex<RawSpinlock, T>;</span>
<span class="doccomment">//! pub type SpinlockGuard<'a, T> = lock_api::MutexGuard<'a, RawSpinlock, T>;</span>
<span class="doccomment">//! ```</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! # Extension traits</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! In addition to basic locking & unlocking functionality, you have the option</span>
<span class="doccomment">//! of exposing additional functionality in your lock types by implementing</span>
<span class="doccomment">//! additional traits for it. Examples of extension features include:</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! - Fair unlocking (`RawMutexFair`, `RawRwLockFair`)</span>
<span class="doccomment">//! - Lock timeouts (`RawMutexTimed`, `RawRwLockTimed`)</span>
<span class="doccomment">//! - Downgradable write locks (`RawRwLockDowngradable`)</span>
<span class="doccomment">//! - Recursive read locks (`RawRwLockRecursive`)</span>
<span class="doccomment">//! - Upgradable read locks (`RawRwLockUpgrade`)</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! The `Mutex` and `RwLock` wrappers will automatically expose this additional</span>
<span class="doccomment">//! functionality if the raw lock type implements these extension traits.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! # Cargo features</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! This crate supports three cargo features:</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! - `owning_ref`: Allows your lock types to be used with the `owning_ref` crate.</span>
<span class="doccomment">//! - `arc_lock`: Enables locking from an `Arc`. This enables types such as `ArcMutexGuard`. Note that this</span>
<span class="doccomment">//! requires the `alloc` crate to be present.</span>
<span class="attribute">#![<span class="ident">no_std</span>]</span>
<span class="attribute">#![<span class="ident">warn</span>(<span class="ident">missing_docs</span>)]</span>
<span class="attribute">#![<span class="ident">warn</span>(<span class="ident">rust_2018_idioms</span>)]</span>
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">scopeguard</span>;
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"arc_lock"</span>)]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">alloc</span>;
<span class="doccomment">/// Marker type which indicates that the Guard type for a lock is `Send`.</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">GuardSend</span>(());
<span class="doccomment">/// Marker type which indicates that the Guard type for a lock is not `Send`.</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">GuardNoSend</span>(<span class="kw-2">*mut</span> ());
<span class="kw">unsafe</span> <span class="kw">impl</span> <span class="ident">Sync</span> <span class="kw">for</span> <span class="ident">GuardNoSend</span> {}
<span class="kw">mod</span> <span class="ident">mutex</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::mutex</span>::<span class="kw-2">*</span>;
<span class="kw">mod</span> <span class="ident">remutex</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::remutex</span>::<span class="kw-2">*</span>;
<span class="kw">mod</span> <span class="ident">rwlock</span>;
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::rwlock</span>::<span class="kw-2">*</span>;
</code></pre></div>
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="lock_api" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.64.0-nightly (495b21669 2022-07-03)" ></div>
</body></html>