Adding large folders

This commit is contained in:
2026-02-26 12:00:21 -05:00
parent 5400d82acd
commit 49701c85ad
47332 changed files with 1942573 additions and 0 deletions

View File

@@ -0,0 +1,619 @@
<!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/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-core-0.1.36/src/callsite.rs`."><title>callsite.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tracing_core" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="icon" href="https://raw.githubusercontent.com/tokio-rs/tracing/main/assets/favicon.ico"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">tracing_core/</div>callsite.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Callsites represent the source locations from which spans or events
<a href=#2 id=2 data-nosnippet>2</a>//! originate.
<a href=#3 id=3 data-nosnippet>3</a>//!
<a href=#4 id=4 data-nosnippet>4</a>//! # What Are Callsites?
<a href=#5 id=5 data-nosnippet>5</a>//!
<a href=#6 id=6 data-nosnippet>6</a>//! Every span or event in `tracing` is associated with a [`Callsite`]. A
<a href=#7 id=7 data-nosnippet>7</a>//! callsite is a small `static` value that is responsible for the following:
<a href=#8 id=8 data-nosnippet>8</a>//!
<a href=#9 id=9 data-nosnippet>9</a>//! * Storing the span or event's [`Metadata`],
<a href=#10 id=10 data-nosnippet>10</a>//! * Uniquely [identifying](Identifier) the span or event definition,
<a href=#11 id=11 data-nosnippet>11</a>//! * Caching the subscriber's [`Interest`][^1] in that span or event, to avoid
<a href=#12 id=12 data-nosnippet>12</a>//! re-evaluating filters.
<a href=#13 id=13 data-nosnippet>13</a>//!
<a href=#14 id=14 data-nosnippet>14</a>//! # Registering Callsites
<a href=#15 id=15 data-nosnippet>15</a>//!
<a href=#16 id=16 data-nosnippet>16</a>//! When a span or event is recorded for the first time, its callsite
<a href=#17 id=17 data-nosnippet>17</a>//! [`register`]s itself with the global callsite registry. Registering a
<a href=#18 id=18 data-nosnippet>18</a>//! callsite calls the [`Subscriber::register_callsite`][`register_callsite`]
<a href=#19 id=19 data-nosnippet>19</a>//! method with that callsite's [`Metadata`] on every currently active
<a href=#20 id=20 data-nosnippet>20</a>//! subscriber. This serves two primary purposes: informing subscribers of the
<a href=#21 id=21 data-nosnippet>21</a>//! callsite's existence, and performing static filtering.
<a href=#22 id=22 data-nosnippet>22</a>//!
<a href=#23 id=23 data-nosnippet>23</a>//! ## Callsite Existence
<a href=#24 id=24 data-nosnippet>24</a>//!
<a href=#25 id=25 data-nosnippet>25</a>//! If a [`Subscriber`] implementation wishes to allocate storage for each
<a href=#26 id=26 data-nosnippet>26</a>//! unique span/event location in the program, or pre-compute some value
<a href=#27 id=27 data-nosnippet>27</a>//! that will be used to record that span or event in the future, it can
<a href=#28 id=28 data-nosnippet>28</a>//! do so in its [`register_callsite`] method.
<a href=#29 id=29 data-nosnippet>29</a>//!
<a href=#30 id=30 data-nosnippet>30</a>//! ## Performing Static Filtering
<a href=#31 id=31 data-nosnippet>31</a>//!
<a href=#32 id=32 data-nosnippet>32</a>//! The [`register_callsite`] method returns an [`Interest`] value,
<a href=#33 id=33 data-nosnippet>33</a>//! which indicates that the subscriber either [always] wishes to record
<a href=#34 id=34 data-nosnippet>34</a>//! that span or event, [sometimes] wishes to record it based on a
<a href=#35 id=35 data-nosnippet>35</a>//! dynamic filter evaluation, or [never] wishes to record it.
<a href=#36 id=36 data-nosnippet>36</a>//!
<a href=#37 id=37 data-nosnippet>37</a>//! When registering a new callsite, the [`Interest`]s returned by every
<a href=#38 id=38 data-nosnippet>38</a>//! currently active subscriber are combined, and the result is stored at
<a href=#39 id=39 data-nosnippet>39</a>//! each callsite. This way, when the span or event occurs in the
<a href=#40 id=40 data-nosnippet>40</a>//! future, the cached [`Interest`] value can be checked efficiently
<a href=#41 id=41 data-nosnippet>41</a>//! to determine if the span or event should be recorded, without
<a href=#42 id=42 data-nosnippet>42</a>//! needing to perform expensive filtering (i.e. calling the
<a href=#43 id=43 data-nosnippet>43</a>//! [`Subscriber::enabled`] method every time a span or event occurs).
<a href=#44 id=44 data-nosnippet>44</a>//!
<a href=#45 id=45 data-nosnippet>45</a>//! ### Rebuilding Cached Interest
<a href=#46 id=46 data-nosnippet>46</a>//!
<a href=#47 id=47 data-nosnippet>47</a>//! When a new [`Dispatch`] is created (i.e. a new subscriber becomes
<a href=#48 id=48 data-nosnippet>48</a>//! active), any previously cached [`Interest`] values are re-evaluated
<a href=#49 id=49 data-nosnippet>49</a>//! for all callsites in the program. This way, if the new subscriber
<a href=#50 id=50 data-nosnippet>50</a>//! will enable a callsite that was not previously enabled, the
<a href=#51 id=51 data-nosnippet>51</a>//! [`Interest`] in that callsite is updated. Similarly, when a
<a href=#52 id=52 data-nosnippet>52</a>//! subscriber is dropped, the interest cache is also re-evaluated, so
<a href=#53 id=53 data-nosnippet>53</a>//! that any callsites enabled only by that subscriber are disabled.
<a href=#54 id=54 data-nosnippet>54</a>//!
<a href=#55 id=55 data-nosnippet>55</a>//! In addition, the [`rebuild_interest_cache`] function in this module can be
<a href=#56 id=56 data-nosnippet>56</a>//! used to manually invalidate all cached interest and re-register those
<a href=#57 id=57 data-nosnippet>57</a>//! callsites. This function is useful in situations where a subscriber's
<a href=#58 id=58 data-nosnippet>58</a>//! interest can change, but it does so relatively infrequently. The subscriber
<a href=#59 id=59 data-nosnippet>59</a>//! may wish for its interest to be cached most of the time, and return
<a href=#60 id=60 data-nosnippet>60</a>//! [`Interest::always`][always] or [`Interest::never`][never] in its
<a href=#61 id=61 data-nosnippet>61</a>//! [`register_callsite`] method, so that its [`Subscriber::enabled`] method
<a href=#62 id=62 data-nosnippet>62</a>//! doesn't need to be evaluated every time a span or event is recorded.
<a href=#63 id=63 data-nosnippet>63</a>//! However, when the configuration changes, the subscriber can call
<a href=#64 id=64 data-nosnippet>64</a>//! [`rebuild_interest_cache`] to re-evaluate the entire interest cache with its
<a href=#65 id=65 data-nosnippet>65</a>//! new configuration. This is a relatively costly operation, but if the
<a href=#66 id=66 data-nosnippet>66</a>//! configuration changes infrequently, it may be more efficient than calling
<a href=#67 id=67 data-nosnippet>67</a>//! [`Subscriber::enabled`] frequently.
<a href=#68 id=68 data-nosnippet>68</a>//!
<a href=#69 id=69 data-nosnippet>69</a>//! # Implementing Callsites
<a href=#70 id=70 data-nosnippet>70</a>//!
<a href=#71 id=71 data-nosnippet>71</a>//! In most cases, instrumenting code using `tracing` should *not* require
<a href=#72 id=72 data-nosnippet>72</a>//! implementing the [`Callsite`] trait directly. When using the [`tracing`
<a href=#73 id=73 data-nosnippet>73</a>//! crate's macros][macros] or the [`#[instrument]` attribute][instrument], a
<a href=#74 id=74 data-nosnippet>74</a>//! `Callsite` is automatically generated.
<a href=#75 id=75 data-nosnippet>75</a>//!
<a href=#76 id=76 data-nosnippet>76</a>//! However, code which provides alternative forms of `tracing` instrumentation
<a href=#77 id=77 data-nosnippet>77</a>//! may need to interact with the callsite system directly. If
<a href=#78 id=78 data-nosnippet>78</a>//! instrumentation-side code needs to produce a `Callsite` to emit spans or
<a href=#79 id=79 data-nosnippet>79</a>//! events, the [`DefaultCallsite`] struct provided in this module is a
<a href=#80 id=80 data-nosnippet>80</a>//! ready-made `Callsite` implementation that is suitable for most uses. When
<a href=#81 id=81 data-nosnippet>81</a>//! possible, the use of `DefaultCallsite` should be preferred over implementing
<a href=#82 id=82 data-nosnippet>82</a>//! [`Callsite`] for user types, as `DefaultCallsite` may benefit from
<a href=#83 id=83 data-nosnippet>83</a>//! additional performance optimizations.
<a href=#84 id=84 data-nosnippet>84</a>//!
<a href=#85 id=85 data-nosnippet>85</a>//! [^1]: Returned by the [`Subscriber::register_callsite`][`register_callsite`]
<a href=#86 id=86 data-nosnippet>86</a>//! method.
<a href=#87 id=87 data-nosnippet>87</a>//!
<a href=#88 id=88 data-nosnippet>88</a>//! [`Metadata`]: crate::metadata::Metadata
<a href=#89 id=89 data-nosnippet>89</a>//! [`Interest`]: crate::subscriber::Interest
<a href=#90 id=90 data-nosnippet>90</a>//! [`Subscriber`]: crate::subscriber::Subscriber
<a href=#91 id=91 data-nosnippet>91</a>//! [`register_callsite`]: crate::subscriber::Subscriber::register_callsite
<a href=#92 id=92 data-nosnippet>92</a>//! [`Subscriber::enabled`]: crate::subscriber::Subscriber::enabled
<a href=#93 id=93 data-nosnippet>93</a>//! [always]: crate::subscriber::Interest::always
<a href=#94 id=94 data-nosnippet>94</a>//! [sometimes]: crate::subscriber::Interest::sometimes
<a href=#95 id=95 data-nosnippet>95</a>//! [never]: crate::subscriber::Interest::never
<a href=#96 id=96 data-nosnippet>96</a>//! [`Dispatch`]: crate::dispatcher::Dispatch
<a href=#97 id=97 data-nosnippet>97</a>//! [macros]: https://docs.rs/tracing/latest/tracing/#macros
<a href=#98 id=98 data-nosnippet>98</a>//! [instrument]: https://docs.rs/tracing/latest/tracing/attr.instrument.html
<a href=#99 id=99 data-nosnippet>99</a>
<a href=#100 id=100 data-nosnippet>100</a></span><span class="kw">use </span>alloc::vec::Vec;
<a href=#101 id=101 data-nosnippet>101</a><span class="kw">use </span>core::{
<a href=#102 id=102 data-nosnippet>102</a> any::TypeId,
<a href=#103 id=103 data-nosnippet>103</a> fmt,
<a href=#104 id=104 data-nosnippet>104</a> hash::{Hash, Hasher},
<a href=#105 id=105 data-nosnippet>105</a> ptr,
<a href=#106 id=106 data-nosnippet>106</a> sync::atomic::{AtomicBool, AtomicPtr, AtomicU8, Ordering},
<a href=#107 id=107 data-nosnippet>107</a>};
<a href=#108 id=108 data-nosnippet>108</a>
<a href=#109 id=109 data-nosnippet>109</a><span class="kw">use </span><span class="self">self</span>::dispatchers::Dispatchers;
<a href=#110 id=110 data-nosnippet>110</a><span class="kw">use crate</span>::{
<a href=#111 id=111 data-nosnippet>111</a> dispatcher::Dispatch,
<a href=#112 id=112 data-nosnippet>112</a> lazy::Lazy,
<a href=#113 id=113 data-nosnippet>113</a> metadata::{LevelFilter, Metadata},
<a href=#114 id=114 data-nosnippet>114</a> subscriber::Interest,
<a href=#115 id=115 data-nosnippet>115</a> sync::Mutex,
<a href=#116 id=116 data-nosnippet>116</a>};
<a href=#117 id=117 data-nosnippet>117</a>
<a href=#118 id=118 data-nosnippet>118</a><span class="doccomment">/// Trait implemented by callsites.
<a href=#119 id=119 data-nosnippet>119</a>///
<a href=#120 id=120 data-nosnippet>120</a>/// These functions are only intended to be called by the callsite registry, which
<a href=#121 id=121 data-nosnippet>121</a>/// correctly handles determining the common interest between all subscribers.
<a href=#122 id=122 data-nosnippet>122</a>///
<a href=#123 id=123 data-nosnippet>123</a>/// See the [module-level documentation](crate::callsite) for details on
<a href=#124 id=124 data-nosnippet>124</a>/// callsites.
<a href=#125 id=125 data-nosnippet>125</a></span><span class="kw">pub trait </span>Callsite: Sync {
<a href=#126 id=126 data-nosnippet>126</a> <span class="doccomment">/// Sets the [`Interest`] for this callsite.
<a href=#127 id=127 data-nosnippet>127</a> ///
<a href=#128 id=128 data-nosnippet>128</a> /// See the [documentation on callsite interest caching][cache-docs] for
<a href=#129 id=129 data-nosnippet>129</a> /// details.
<a href=#130 id=130 data-nosnippet>130</a> ///
<a href=#131 id=131 data-nosnippet>131</a> /// [`Interest`]: super::subscriber::Interest
<a href=#132 id=132 data-nosnippet>132</a> /// [cache-docs]: crate::callsite#performing-static-filtering
<a href=#133 id=133 data-nosnippet>133</a> </span><span class="kw">fn </span>set_interest(<span class="kw-2">&amp;</span><span class="self">self</span>, interest: Interest);
<a href=#134 id=134 data-nosnippet>134</a>
<a href=#135 id=135 data-nosnippet>135</a> <span class="doccomment">/// Returns the [metadata] associated with the callsite.
<a href=#136 id=136 data-nosnippet>136</a> ///
<a href=#137 id=137 data-nosnippet>137</a> /// &lt;div class="example-wrap" style="display:inline-block"&gt;
<a href=#138 id=138 data-nosnippet>138</a> /// &lt;pre class="ignore" style="white-space:normal;font:inherit;"&gt;
<a href=#139 id=139 data-nosnippet>139</a> ///
<a href=#140 id=140 data-nosnippet>140</a> /// **Note:** Implementations of this method should not produce [`Metadata`]
<a href=#141 id=141 data-nosnippet>141</a> /// that share the same callsite [`Identifier`] but otherwise differ in any
<a href=#142 id=142 data-nosnippet>142</a> /// way (e.g., have different `name`s).
<a href=#143 id=143 data-nosnippet>143</a> ///
<a href=#144 id=144 data-nosnippet>144</a> /// &lt;/pre&gt;&lt;/div&gt;
<a href=#145 id=145 data-nosnippet>145</a> ///
<a href=#146 id=146 data-nosnippet>146</a> /// [metadata]: super::metadata::Metadata
<a href=#147 id=147 data-nosnippet>147</a> </span><span class="kw">fn </span>metadata(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>Metadata&lt;<span class="lifetime">'_</span>&gt;;
<a href=#148 id=148 data-nosnippet>148</a>
<a href=#149 id=149 data-nosnippet>149</a> <span class="doccomment">/// This method is an *internal implementation detail* of `tracing-core`. It
<a href=#150 id=150 data-nosnippet>150</a> /// is *not* intended to be called or overridden from downstream code.
<a href=#151 id=151 data-nosnippet>151</a> ///
<a href=#152 id=152 data-nosnippet>152</a> /// The `Private` type can only be constructed from within `tracing-core`.
<a href=#153 id=153 data-nosnippet>153</a> /// Because this method takes a `Private` as an argument, it cannot be
<a href=#154 id=154 data-nosnippet>154</a> /// called from (safe) code external to `tracing-core`. Because it must
<a href=#155 id=155 data-nosnippet>155</a> /// *return* a `Private`, the only valid implementation possible outside of
<a href=#156 id=156 data-nosnippet>156</a> /// `tracing-core` would have to always unconditionally panic.
<a href=#157 id=157 data-nosnippet>157</a> ///
<a href=#158 id=158 data-nosnippet>158</a> /// THIS IS BY DESIGN. There is currently no valid reason for code outside
<a href=#159 id=159 data-nosnippet>159</a> /// of `tracing-core` to override this method.
<a href=#160 id=160 data-nosnippet>160</a> </span><span class="comment">// TODO(eliza): this could be used to implement a public downcasting API
<a href=#161 id=161 data-nosnippet>161</a> // for `&amp;dyn Callsite`s in the future.
<a href=#162 id=162 data-nosnippet>162</a> </span><span class="attr">#[doc(hidden)]
<a href=#163 id=163 data-nosnippet>163</a> #[inline]
<a href=#164 id=164 data-nosnippet>164</a> </span><span class="kw">fn </span>private_type_id(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="kw">_</span>: private::Private&lt;()&gt;) -&gt; private::Private&lt;TypeId&gt;
<a href=#165 id=165 data-nosnippet>165</a> <span class="kw">where
<a href=#166 id=166 data-nosnippet>166</a> </span><span class="self">Self</span>: <span class="lifetime">'static</span>,
<a href=#167 id=167 data-nosnippet>167</a> {
<a href=#168 id=168 data-nosnippet>168</a> private::Private(TypeId::of::&lt;<span class="self">Self</span>&gt;())
<a href=#169 id=169 data-nosnippet>169</a> }
<a href=#170 id=170 data-nosnippet>170</a>}
<a href=#171 id=171 data-nosnippet>171</a>
<a href=#172 id=172 data-nosnippet>172</a><span class="doccomment">/// Uniquely identifies a [`Callsite`]
<a href=#173 id=173 data-nosnippet>173</a>///
<a href=#174 id=174 data-nosnippet>174</a>/// Two `Identifier`s are equal if they both refer to the same callsite.
<a href=#175 id=175 data-nosnippet>175</a>///
<a href=#176 id=176 data-nosnippet>176</a>/// [`Callsite`]: super::callsite::Callsite
<a href=#177 id=177 data-nosnippet>177</a></span><span class="attr">#[derive(Clone)]
<a href=#178 id=178 data-nosnippet>178</a></span><span class="kw">pub struct </span>Identifier(
<a href=#179 id=179 data-nosnippet>179</a> <span class="doccomment">/// **Warning**: The fields on this type are currently `pub` because it must
<a href=#180 id=180 data-nosnippet>180</a> /// be able to be constructed statically by macros. However, when `const
<a href=#181 id=181 data-nosnippet>181</a> /// fn`s are available on stable Rust, this will no longer be necessary.
<a href=#182 id=182 data-nosnippet>182</a> /// Thus, these fields are *not* considered stable public API, and they may
<a href=#183 id=183 data-nosnippet>183</a> /// change warning. Do not rely on any fields on `Identifier`. When
<a href=#184 id=184 data-nosnippet>184</a> /// constructing new `Identifier`s, use the `identify_callsite!` macro
<a href=#185 id=185 data-nosnippet>185</a> /// instead.
<a href=#186 id=186 data-nosnippet>186</a> </span><span class="attr">#[doc(hidden)]
<a href=#187 id=187 data-nosnippet>187</a> </span><span class="kw">pub </span><span class="kw-2">&amp;</span><span class="lifetime">'static </span><span class="kw">dyn </span>Callsite,
<a href=#188 id=188 data-nosnippet>188</a>);
<a href=#189 id=189 data-nosnippet>189</a>
<a href=#190 id=190 data-nosnippet>190</a><span class="doccomment">/// A default [`Callsite`] implementation.
<a href=#191 id=191 data-nosnippet>191</a></span><span class="attr">#[derive(Debug)]
<a href=#192 id=192 data-nosnippet>192</a></span><span class="kw">pub struct </span>DefaultCallsite {
<a href=#193 id=193 data-nosnippet>193</a> interest: AtomicU8,
<a href=#194 id=194 data-nosnippet>194</a> registration: AtomicU8,
<a href=#195 id=195 data-nosnippet>195</a> meta: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;,
<a href=#196 id=196 data-nosnippet>196</a> next: AtomicPtr&lt;<span class="self">Self</span>&gt;,
<a href=#197 id=197 data-nosnippet>197</a>}
<a href=#198 id=198 data-nosnippet>198</a>
<a href=#199 id=199 data-nosnippet>199</a><span class="doccomment">/// Clear and reregister interest on every [`Callsite`]
<a href=#200 id=200 data-nosnippet>200</a>///
<a href=#201 id=201 data-nosnippet>201</a>/// This function is intended for runtime reconfiguration of filters on traces
<a href=#202 id=202 data-nosnippet>202</a>/// when the filter recalculation is much less frequent than trace events are.
<a href=#203 id=203 data-nosnippet>203</a>/// The alternative is to have the [`Subscriber`] that supports runtime
<a href=#204 id=204 data-nosnippet>204</a>/// reconfiguration of filters always return [`Interest::sometimes()`] so that
<a href=#205 id=205 data-nosnippet>205</a>/// [`enabled`] is evaluated for every event.
<a href=#206 id=206 data-nosnippet>206</a>///
<a href=#207 id=207 data-nosnippet>207</a>/// This function will also re-compute the global maximum level as determined by
<a href=#208 id=208 data-nosnippet>208</a>/// the [`max_level_hint`] method. If a [`Subscriber`]
<a href=#209 id=209 data-nosnippet>209</a>/// implementation changes the value returned by its `max_level_hint`
<a href=#210 id=210 data-nosnippet>210</a>/// implementation at runtime, then it **must** call this function after that
<a href=#211 id=211 data-nosnippet>211</a>/// value changes, in order for the change to be reflected.
<a href=#212 id=212 data-nosnippet>212</a>///
<a href=#213 id=213 data-nosnippet>213</a>/// See the [documentation on callsite interest caching][cache-docs] for
<a href=#214 id=214 data-nosnippet>214</a>/// additional information on this function's usage.
<a href=#215 id=215 data-nosnippet>215</a>///
<a href=#216 id=216 data-nosnippet>216</a>/// [`max_level_hint`]: super::subscriber::Subscriber::max_level_hint
<a href=#217 id=217 data-nosnippet>217</a>/// [`Callsite`]: super::callsite::Callsite
<a href=#218 id=218 data-nosnippet>218</a>/// [`enabled`]: super::subscriber::Subscriber#tymethod.enabled
<a href=#219 id=219 data-nosnippet>219</a>/// [`Interest::sometimes()`]: super::subscriber::Interest::sometimes
<a href=#220 id=220 data-nosnippet>220</a>/// [`Subscriber`]: super::subscriber::Subscriber
<a href=#221 id=221 data-nosnippet>221</a>/// [cache-docs]: crate::callsite#rebuilding-cached-interest
<a href=#222 id=222 data-nosnippet>222</a></span><span class="kw">pub fn </span>rebuild_interest_cache() {
<a href=#223 id=223 data-nosnippet>223</a> CALLSITES.rebuild_interest(DISPATCHERS.rebuilder());
<a href=#224 id=224 data-nosnippet>224</a>}
<a href=#225 id=225 data-nosnippet>225</a>
<a href=#226 id=226 data-nosnippet>226</a><span class="doccomment">/// Register a new [`Callsite`] with the global registry.
<a href=#227 id=227 data-nosnippet>227</a>///
<a href=#228 id=228 data-nosnippet>228</a>/// This should be called once per callsite after the callsite has been
<a href=#229 id=229 data-nosnippet>229</a>/// constructed.
<a href=#230 id=230 data-nosnippet>230</a>///
<a href=#231 id=231 data-nosnippet>231</a>/// See the [documentation on callsite registration][reg-docs] for details
<a href=#232 id=232 data-nosnippet>232</a>/// on the global callsite registry.
<a href=#233 id=233 data-nosnippet>233</a>///
<a href=#234 id=234 data-nosnippet>234</a>/// [`Callsite`]: crate::callsite::Callsite
<a href=#235 id=235 data-nosnippet>235</a>/// [reg-docs]: crate::callsite#registering-callsites
<a href=#236 id=236 data-nosnippet>236</a></span><span class="kw">pub fn </span>register(callsite: <span class="kw-2">&amp;</span><span class="lifetime">'static </span><span class="kw">dyn </span>Callsite) {
<a href=#237 id=237 data-nosnippet>237</a> <span class="comment">// Is this a `DefaultCallsite`? If so, use the fancy linked list!
<a href=#238 id=238 data-nosnippet>238</a> </span><span class="kw">if </span>callsite.private_type_id(private::Private(())).<span class="number">0 </span>== TypeId::of::&lt;DefaultCallsite&gt;() {
<a href=#239 id=239 data-nosnippet>239</a> <span class="kw">let </span>callsite = <span class="kw">unsafe </span>{
<a href=#240 id=240 data-nosnippet>240</a> <span class="comment">// Safety: the pointer cast is safe because the type id of the
<a href=#241 id=241 data-nosnippet>241</a> // provided callsite matches that of the target type for the cast
<a href=#242 id=242 data-nosnippet>242</a> // (`DefaultCallsite`). Because user implementations of `Callsite`
<a href=#243 id=243 data-nosnippet>243</a> // cannot override `private_type_id`, we can trust that the callsite
<a href=#244 id=244 data-nosnippet>244</a> // is not lying about its type ID.
<a href=#245 id=245 data-nosnippet>245</a> </span><span class="kw-2">&amp;*</span>(callsite <span class="kw">as </span><span class="kw-2">*const </span><span class="kw">dyn </span>Callsite <span class="kw">as </span><span class="kw-2">*const </span>DefaultCallsite)
<a href=#246 id=246 data-nosnippet>246</a> };
<a href=#247 id=247 data-nosnippet>247</a> CALLSITES.push_default(callsite);
<a href=#248 id=248 data-nosnippet>248</a> } <span class="kw">else </span>{
<a href=#249 id=249 data-nosnippet>249</a> CALLSITES.push_dyn(callsite);
<a href=#250 id=250 data-nosnippet>250</a> }
<a href=#251 id=251 data-nosnippet>251</a>
<a href=#252 id=252 data-nosnippet>252</a> rebuild_callsite_interest(callsite, <span class="kw-2">&amp;</span>DISPATCHERS.rebuilder());
<a href=#253 id=253 data-nosnippet>253</a>}
<a href=#254 id=254 data-nosnippet>254</a>
<a href=#255 id=255 data-nosnippet>255</a><span class="kw">static </span>CALLSITES: Callsites = Callsites {
<a href=#256 id=256 data-nosnippet>256</a> list_head: AtomicPtr::new(ptr::null_mut()),
<a href=#257 id=257 data-nosnippet>257</a> has_locked_callsites: AtomicBool::new(<span class="bool-val">false</span>),
<a href=#258 id=258 data-nosnippet>258</a>};
<a href=#259 id=259 data-nosnippet>259</a>
<a href=#260 id=260 data-nosnippet>260</a><span class="kw">static </span>DISPATCHERS: Dispatchers = Dispatchers::new();
<a href=#261 id=261 data-nosnippet>261</a>
<a href=#262 id=262 data-nosnippet>262</a><span class="kw">static </span>LOCKED_CALLSITES: Lazy&lt;Mutex&lt;Vec&lt;<span class="kw-2">&amp;</span><span class="lifetime">'static </span><span class="kw">dyn </span>Callsite&gt;&gt;&gt; = Lazy::new(Default::default);
<a href=#263 id=263 data-nosnippet>263</a>
<a href=#264 id=264 data-nosnippet>264</a><span class="kw">struct </span>Callsites {
<a href=#265 id=265 data-nosnippet>265</a> list_head: AtomicPtr&lt;DefaultCallsite&gt;,
<a href=#266 id=266 data-nosnippet>266</a> has_locked_callsites: AtomicBool,
<a href=#267 id=267 data-nosnippet>267</a>}
<a href=#268 id=268 data-nosnippet>268</a>
<a href=#269 id=269 data-nosnippet>269</a><span class="comment">// === impl DefaultCallsite ===
<a href=#270 id=270 data-nosnippet>270</a>
<a href=#271 id=271 data-nosnippet>271</a></span><span class="kw">impl </span>DefaultCallsite {
<a href=#272 id=272 data-nosnippet>272</a> <span class="kw">const </span>UNREGISTERED: u8 = <span class="number">0</span>;
<a href=#273 id=273 data-nosnippet>273</a> <span class="kw">const </span>REGISTERING: u8 = <span class="number">1</span>;
<a href=#274 id=274 data-nosnippet>274</a> <span class="kw">const </span>REGISTERED: u8 = <span class="number">2</span>;
<a href=#275 id=275 data-nosnippet>275</a>
<a href=#276 id=276 data-nosnippet>276</a> <span class="kw">const </span>INTEREST_NEVER: u8 = <span class="number">0</span>;
<a href=#277 id=277 data-nosnippet>277</a> <span class="kw">const </span>INTEREST_SOMETIMES: u8 = <span class="number">1</span>;
<a href=#278 id=278 data-nosnippet>278</a> <span class="kw">const </span>INTEREST_ALWAYS: u8 = <span class="number">2</span>;
<a href=#279 id=279 data-nosnippet>279</a>
<a href=#280 id=280 data-nosnippet>280</a> <span class="doccomment">/// Returns a new `DefaultCallsite` with the specified `Metadata`.
<a href=#281 id=281 data-nosnippet>281</a> </span><span class="kw">pub const fn </span>new(meta: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#282 id=282 data-nosnippet>282</a> <span class="self">Self </span>{
<a href=#283 id=283 data-nosnippet>283</a> interest: AtomicU8::new(<span class="number">0xFF</span>),
<a href=#284 id=284 data-nosnippet>284</a> meta,
<a href=#285 id=285 data-nosnippet>285</a> next: AtomicPtr::new(ptr::null_mut()),
<a href=#286 id=286 data-nosnippet>286</a> registration: AtomicU8::new(<span class="self">Self</span>::UNREGISTERED),
<a href=#287 id=287 data-nosnippet>287</a> }
<a href=#288 id=288 data-nosnippet>288</a> }
<a href=#289 id=289 data-nosnippet>289</a>
<a href=#290 id=290 data-nosnippet>290</a> <span class="doccomment">/// Registers this callsite with the global callsite registry.
<a href=#291 id=291 data-nosnippet>291</a> ///
<a href=#292 id=292 data-nosnippet>292</a> /// If the callsite is already registered, this does nothing. When using
<a href=#293 id=293 data-nosnippet>293</a> /// [`DefaultCallsite`], this method should be preferred over
<a href=#294 id=294 data-nosnippet>294</a> /// [`tracing_core::callsite::register`], as it ensures that the callsite is
<a href=#295 id=295 data-nosnippet>295</a> /// only registered a single time.
<a href=#296 id=296 data-nosnippet>296</a> ///
<a href=#297 id=297 data-nosnippet>297</a> /// Other callsite implementations will generally ensure that
<a href=#298 id=298 data-nosnippet>298</a> /// callsites are not re-registered through another mechanism.
<a href=#299 id=299 data-nosnippet>299</a> ///
<a href=#300 id=300 data-nosnippet>300</a> /// See the [documentation on callsite registration][reg-docs] for details
<a href=#301 id=301 data-nosnippet>301</a> /// on the global callsite registry.
<a href=#302 id=302 data-nosnippet>302</a> ///
<a href=#303 id=303 data-nosnippet>303</a> /// [`tracing_core::callsite::register`]: crate::callsite::register
<a href=#304 id=304 data-nosnippet>304</a> /// [reg-docs]: crate::callsite#registering-callsites
<a href=#305 id=305 data-nosnippet>305</a> </span><span class="attr">#[inline(never)]
<a href=#306 id=306 data-nosnippet>306</a> </span><span class="comment">// This only happens once (or if the cached interest value was corrupted).
<a href=#307 id=307 data-nosnippet>307</a> </span><span class="attr">#[cold]
<a href=#308 id=308 data-nosnippet>308</a> </span><span class="kw">pub fn </span>register(<span class="kw-2">&amp;</span><span class="lifetime">'static </span><span class="self">self</span>) -&gt; Interest {
<a href=#309 id=309 data-nosnippet>309</a> <span class="comment">// Attempt to advance the registration state to `REGISTERING`...
<a href=#310 id=310 data-nosnippet>310</a> </span><span class="kw">match </span><span class="self">self</span>.registration.compare_exchange(
<a href=#311 id=311 data-nosnippet>311</a> <span class="self">Self</span>::UNREGISTERED,
<a href=#312 id=312 data-nosnippet>312</a> <span class="self">Self</span>::REGISTERING,
<a href=#313 id=313 data-nosnippet>313</a> Ordering::AcqRel,
<a href=#314 id=314 data-nosnippet>314</a> Ordering::Acquire,
<a href=#315 id=315 data-nosnippet>315</a> ) {
<a href=#316 id=316 data-nosnippet>316</a> <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
<a href=#317 id=317 data-nosnippet>317</a> <span class="comment">// Okay, we advanced the state, try to register the callsite.
<a href=#318 id=318 data-nosnippet>318</a> </span>CALLSITES.push_default(<span class="self">self</span>);
<a href=#319 id=319 data-nosnippet>319</a> rebuild_callsite_interest(<span class="self">self</span>, <span class="kw-2">&amp;</span>DISPATCHERS.rebuilder());
<a href=#320 id=320 data-nosnippet>320</a> <span class="self">self</span>.registration.store(<span class="self">Self</span>::REGISTERED, Ordering::Release);
<a href=#321 id=321 data-nosnippet>321</a> }
<a href=#322 id=322 data-nosnippet>322</a> <span class="comment">// Great, the callsite is already registered! Just load its
<a href=#323 id=323 data-nosnippet>323</a> // previous cached interest.
<a href=#324 id=324 data-nosnippet>324</a> </span><span class="prelude-val">Err</span>(<span class="self">Self</span>::REGISTERED) =&gt; {}
<a href=#325 id=325 data-nosnippet>325</a> <span class="comment">// Someone else is registering...
<a href=#326 id=326 data-nosnippet>326</a> </span><span class="prelude-val">Err</span>(_state) =&gt; {
<a href=#327 id=327 data-nosnippet>327</a> <span class="macro">debug_assert_eq!</span>(
<a href=#328 id=328 data-nosnippet>328</a> _state,
<a href=#329 id=329 data-nosnippet>329</a> <span class="self">Self</span>::REGISTERING,
<a href=#330 id=330 data-nosnippet>330</a> <span class="string">"weird callsite registration state"
<a href=#331 id=331 data-nosnippet>331</a> </span>);
<a href=#332 id=332 data-nosnippet>332</a> <span class="comment">// Just hit `enabled` this time.
<a href=#333 id=333 data-nosnippet>333</a> </span><span class="kw">return </span>Interest::sometimes();
<a href=#334 id=334 data-nosnippet>334</a> }
<a href=#335 id=335 data-nosnippet>335</a> }
<a href=#336 id=336 data-nosnippet>336</a>
<a href=#337 id=337 data-nosnippet>337</a> <span class="kw">match </span><span class="self">self</span>.interest.load(Ordering::Relaxed) {
<a href=#338 id=338 data-nosnippet>338</a> <span class="self">Self</span>::INTEREST_NEVER =&gt; Interest::never(),
<a href=#339 id=339 data-nosnippet>339</a> <span class="self">Self</span>::INTEREST_ALWAYS =&gt; Interest::always(),
<a href=#340 id=340 data-nosnippet>340</a> <span class="kw">_ </span>=&gt; Interest::sometimes(),
<a href=#341 id=341 data-nosnippet>341</a> }
<a href=#342 id=342 data-nosnippet>342</a> }
<a href=#343 id=343 data-nosnippet>343</a>
<a href=#344 id=344 data-nosnippet>344</a> <span class="doccomment">/// Returns the callsite's cached `Interest`, or registers it for the
<a href=#345 id=345 data-nosnippet>345</a> /// first time if it has not yet been registered.
<a href=#346 id=346 data-nosnippet>346</a> </span><span class="attr">#[inline]
<a href=#347 id=347 data-nosnippet>347</a> </span><span class="kw">pub fn </span>interest(<span class="kw-2">&amp;</span><span class="lifetime">'static </span><span class="self">self</span>) -&gt; Interest {
<a href=#348 id=348 data-nosnippet>348</a> <span class="kw">match </span><span class="self">self</span>.interest.load(Ordering::Relaxed) {
<a href=#349 id=349 data-nosnippet>349</a> <span class="self">Self</span>::INTEREST_NEVER =&gt; Interest::never(),
<a href=#350 id=350 data-nosnippet>350</a> <span class="self">Self</span>::INTEREST_SOMETIMES =&gt; Interest::sometimes(),
<a href=#351 id=351 data-nosnippet>351</a> <span class="self">Self</span>::INTEREST_ALWAYS =&gt; Interest::always(),
<a href=#352 id=352 data-nosnippet>352</a> <span class="kw">_ </span>=&gt; <span class="self">self</span>.register(),
<a href=#353 id=353 data-nosnippet>353</a> }
<a href=#354 id=354 data-nosnippet>354</a> }
<a href=#355 id=355 data-nosnippet>355</a>}
<a href=#356 id=356 data-nosnippet>356</a>
<a href=#357 id=357 data-nosnippet>357</a><span class="kw">impl </span>Callsite <span class="kw">for </span>DefaultCallsite {
<a href=#358 id=358 data-nosnippet>358</a> <span class="kw">fn </span>set_interest(<span class="kw-2">&amp;</span><span class="self">self</span>, interest: Interest) {
<a href=#359 id=359 data-nosnippet>359</a> <span class="kw">let </span>interest = <span class="kw">match </span>() {
<a href=#360 id=360 data-nosnippet>360</a> <span class="kw">_ if </span>interest.is_never() =&gt; <span class="self">Self</span>::INTEREST_NEVER,
<a href=#361 id=361 data-nosnippet>361</a> <span class="kw">_ if </span>interest.is_always() =&gt; <span class="self">Self</span>::INTEREST_ALWAYS,
<a href=#362 id=362 data-nosnippet>362</a> <span class="kw">_ </span>=&gt; <span class="self">Self</span>::INTEREST_SOMETIMES,
<a href=#363 id=363 data-nosnippet>363</a> };
<a href=#364 id=364 data-nosnippet>364</a> <span class="self">self</span>.interest.store(interest, Ordering::SeqCst);
<a href=#365 id=365 data-nosnippet>365</a> }
<a href=#366 id=366 data-nosnippet>366</a>
<a href=#367 id=367 data-nosnippet>367</a> <span class="attr">#[inline(always)]
<a href=#368 id=368 data-nosnippet>368</a> </span><span class="kw">fn </span>metadata(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>Metadata&lt;<span class="lifetime">'static</span>&gt; {
<a href=#369 id=369 data-nosnippet>369</a> <span class="self">self</span>.meta
<a href=#370 id=370 data-nosnippet>370</a> }
<a href=#371 id=371 data-nosnippet>371</a>}
<a href=#372 id=372 data-nosnippet>372</a>
<a href=#373 id=373 data-nosnippet>373</a><span class="comment">// ===== impl Identifier =====
<a href=#374 id=374 data-nosnippet>374</a>
<a href=#375 id=375 data-nosnippet>375</a></span><span class="kw">impl </span>PartialEq <span class="kw">for </span>Identifier {
<a href=#376 id=376 data-nosnippet>376</a> <span class="kw">fn </span>eq(<span class="kw-2">&amp;</span><span class="self">self</span>, other: <span class="kw-2">&amp;</span>Identifier) -&gt; bool {
<a href=#377 id=377 data-nosnippet>377</a> core::ptr::eq(
<a href=#378 id=378 data-nosnippet>378</a> <span class="self">self</span>.<span class="number">0 </span><span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_ as </span><span class="kw-2">*const </span>(),
<a href=#379 id=379 data-nosnippet>379</a> other.<span class="number">0 </span><span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_ as </span><span class="kw-2">*const </span>(),
<a href=#380 id=380 data-nosnippet>380</a> )
<a href=#381 id=381 data-nosnippet>381</a> }
<a href=#382 id=382 data-nosnippet>382</a>}
<a href=#383 id=383 data-nosnippet>383</a>
<a href=#384 id=384 data-nosnippet>384</a><span class="kw">impl </span>Eq <span class="kw">for </span>Identifier {}
<a href=#385 id=385 data-nosnippet>385</a>
<a href=#386 id=386 data-nosnippet>386</a><span class="kw">impl </span>fmt::Debug <span class="kw">for </span>Identifier {
<a href=#387 id=387 data-nosnippet>387</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#388 id=388 data-nosnippet>388</a> <span class="macro">write!</span>(f, <span class="string">"Identifier({:p})"</span>, <span class="self">self</span>.<span class="number">0</span>)
<a href=#389 id=389 data-nosnippet>389</a> }
<a href=#390 id=390 data-nosnippet>390</a>}
<a href=#391 id=391 data-nosnippet>391</a>
<a href=#392 id=392 data-nosnippet>392</a><span class="kw">impl </span>Hash <span class="kw">for </span>Identifier {
<a href=#393 id=393 data-nosnippet>393</a> <span class="kw">fn </span>hash&lt;H&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, state: <span class="kw-2">&amp;mut </span>H)
<a href=#394 id=394 data-nosnippet>394</a> <span class="kw">where
<a href=#395 id=395 data-nosnippet>395</a> </span>H: Hasher,
<a href=#396 id=396 data-nosnippet>396</a> {
<a href=#397 id=397 data-nosnippet>397</a> (<span class="self">self</span>.<span class="number">0 </span><span class="kw">as </span><span class="kw-2">*const </span><span class="kw">dyn </span>Callsite).hash(state)
<a href=#398 id=398 data-nosnippet>398</a> }
<a href=#399 id=399 data-nosnippet>399</a>}
<a href=#400 id=400 data-nosnippet>400</a>
<a href=#401 id=401 data-nosnippet>401</a><span class="comment">// === impl Callsites ===
<a href=#402 id=402 data-nosnippet>402</a>
<a href=#403 id=403 data-nosnippet>403</a></span><span class="kw">impl </span>Callsites {
<a href=#404 id=404 data-nosnippet>404</a> <span class="doccomment">/// Rebuild `Interest`s for all callsites in the registry.
<a href=#405 id=405 data-nosnippet>405</a> ///
<a href=#406 id=406 data-nosnippet>406</a> /// This also re-computes the max level hint.
<a href=#407 id=407 data-nosnippet>407</a> </span><span class="kw">fn </span>rebuild_interest(<span class="kw-2">&amp;</span><span class="self">self</span>, dispatchers: dispatchers::Rebuilder&lt;<span class="lifetime">'_</span>&gt;) {
<a href=#408 id=408 data-nosnippet>408</a> <span class="kw">let </span><span class="kw-2">mut </span>max_level = LevelFilter::OFF;
<a href=#409 id=409 data-nosnippet>409</a> dispatchers.for_each(|dispatch| {
<a href=#410 id=410 data-nosnippet>410</a> <span class="comment">// If the subscriber did not provide a max level hint, assume
<a href=#411 id=411 data-nosnippet>411</a> // that it may enable every level.
<a href=#412 id=412 data-nosnippet>412</a> </span><span class="kw">let </span>level_hint = dispatch.max_level_hint().unwrap_or(LevelFilter::TRACE);
<a href=#413 id=413 data-nosnippet>413</a> <span class="kw">if </span>level_hint &gt; max_level {
<a href=#414 id=414 data-nosnippet>414</a> max_level = level_hint;
<a href=#415 id=415 data-nosnippet>415</a> }
<a href=#416 id=416 data-nosnippet>416</a> });
<a href=#417 id=417 data-nosnippet>417</a>
<a href=#418 id=418 data-nosnippet>418</a> <span class="self">self</span>.for_each(|callsite| {
<a href=#419 id=419 data-nosnippet>419</a> rebuild_callsite_interest(callsite, <span class="kw-2">&amp;</span>dispatchers);
<a href=#420 id=420 data-nosnippet>420</a> });
<a href=#421 id=421 data-nosnippet>421</a> LevelFilter::set_max(max_level);
<a href=#422 id=422 data-nosnippet>422</a> }
<a href=#423 id=423 data-nosnippet>423</a>
<a href=#424 id=424 data-nosnippet>424</a> <span class="doccomment">/// Push a `dyn Callsite` trait object to the callsite registry.
<a href=#425 id=425 data-nosnippet>425</a> ///
<a href=#426 id=426 data-nosnippet>426</a> /// This will attempt to lock the callsites vector.
<a href=#427 id=427 data-nosnippet>427</a> </span><span class="kw">fn </span>push_dyn(<span class="kw-2">&amp;</span><span class="self">self</span>, callsite: <span class="kw-2">&amp;</span><span class="lifetime">'static </span><span class="kw">dyn </span>Callsite) {
<a href=#428 id=428 data-nosnippet>428</a> <span class="kw">let </span><span class="kw-2">mut </span>lock = LOCKED_CALLSITES.lock().unwrap();
<a href=#429 id=429 data-nosnippet>429</a> <span class="self">self</span>.has_locked_callsites.store(<span class="bool-val">true</span>, Ordering::Release);
<a href=#430 id=430 data-nosnippet>430</a> lock.push(callsite);
<a href=#431 id=431 data-nosnippet>431</a> }
<a href=#432 id=432 data-nosnippet>432</a>
<a href=#433 id=433 data-nosnippet>433</a> <span class="doccomment">/// Push a `DefaultCallsite` to the callsite registry.
<a href=#434 id=434 data-nosnippet>434</a> ///
<a href=#435 id=435 data-nosnippet>435</a> /// If we know the callsite being pushed is a `DefaultCallsite`, we can push
<a href=#436 id=436 data-nosnippet>436</a> /// it to the linked list without having to acquire a lock.
<a href=#437 id=437 data-nosnippet>437</a> </span><span class="kw">fn </span>push_default(<span class="kw-2">&amp;</span><span class="self">self</span>, callsite: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>DefaultCallsite) {
<a href=#438 id=438 data-nosnippet>438</a> <span class="kw">let </span><span class="kw-2">mut </span>head = <span class="self">self</span>.list_head.load(Ordering::Acquire);
<a href=#439 id=439 data-nosnippet>439</a>
<a href=#440 id=440 data-nosnippet>440</a> <span class="kw">loop </span>{
<a href=#441 id=441 data-nosnippet>441</a> callsite.next.store(head, Ordering::Release);
<a href=#442 id=442 data-nosnippet>442</a>
<a href=#443 id=443 data-nosnippet>443</a> <span class="macro">assert_ne!</span>(
<a href=#444 id=444 data-nosnippet>444</a> callsite <span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_</span>, head,
<a href=#445 id=445 data-nosnippet>445</a> <span class="string">"Attempted to register a `DefaultCallsite` that already exists! \
<a href=#446 id=446 data-nosnippet>446</a> This will cause an infinite loop when attempting to read from the \
<a href=#447 id=447 data-nosnippet>447</a> callsite cache. This is likely a bug! You should only need to call \
<a href=#448 id=448 data-nosnippet>448</a> `DefaultCallsite::register` once per `DefaultCallsite`."
<a href=#449 id=449 data-nosnippet>449</a> </span>);
<a href=#450 id=450 data-nosnippet>450</a>
<a href=#451 id=451 data-nosnippet>451</a> <span class="kw">match </span><span class="self">self</span>.list_head.compare_exchange(
<a href=#452 id=452 data-nosnippet>452</a> head,
<a href=#453 id=453 data-nosnippet>453</a> callsite <span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_ as </span><span class="kw-2">*mut </span><span class="kw">_</span>,
<a href=#454 id=454 data-nosnippet>454</a> Ordering::AcqRel,
<a href=#455 id=455 data-nosnippet>455</a> Ordering::Acquire,
<a href=#456 id=456 data-nosnippet>456</a> ) {
<a href=#457 id=457 data-nosnippet>457</a> <span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {
<a href=#458 id=458 data-nosnippet>458</a> <span class="kw">break</span>;
<a href=#459 id=459 data-nosnippet>459</a> }
<a href=#460 id=460 data-nosnippet>460</a> <span class="prelude-val">Err</span>(current) =&gt; head = current,
<a href=#461 id=461 data-nosnippet>461</a> }
<a href=#462 id=462 data-nosnippet>462</a> }
<a href=#463 id=463 data-nosnippet>463</a> }
<a href=#464 id=464 data-nosnippet>464</a>
<a href=#465 id=465 data-nosnippet>465</a> <span class="doccomment">/// Invokes the provided closure `f` with each callsite in the registry.
<a href=#466 id=466 data-nosnippet>466</a> </span><span class="kw">fn </span>for_each(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="kw-2">mut </span>f: <span class="kw">impl </span>FnMut(<span class="kw-2">&amp;</span><span class="lifetime">'static </span><span class="kw">dyn </span>Callsite)) {
<a href=#467 id=467 data-nosnippet>467</a> <span class="kw">let </span><span class="kw-2">mut </span>head = <span class="self">self</span>.list_head.load(Ordering::Acquire);
<a href=#468 id=468 data-nosnippet>468</a>
<a href=#469 id=469 data-nosnippet>469</a> <span class="kw">while let </span><span class="prelude-val">Some</span>(cs) = <span class="kw">unsafe </span>{ head.as_ref() } {
<a href=#470 id=470 data-nosnippet>470</a> f(cs);
<a href=#471 id=471 data-nosnippet>471</a>
<a href=#472 id=472 data-nosnippet>472</a> head = cs.next.load(Ordering::Acquire);
<a href=#473 id=473 data-nosnippet>473</a> }
<a href=#474 id=474 data-nosnippet>474</a>
<a href=#475 id=475 data-nosnippet>475</a> <span class="kw">if </span><span class="self">self</span>.has_locked_callsites.load(Ordering::Acquire) {
<a href=#476 id=476 data-nosnippet>476</a> <span class="kw">let </span>locked = LOCKED_CALLSITES.lock().unwrap();
<a href=#477 id=477 data-nosnippet>477</a> <span class="kw">for </span><span class="kw-2">&amp;</span>cs <span class="kw">in </span>locked.iter() {
<a href=#478 id=478 data-nosnippet>478</a> f(cs);
<a href=#479 id=479 data-nosnippet>479</a> }
<a href=#480 id=480 data-nosnippet>480</a> }
<a href=#481 id=481 data-nosnippet>481</a> }
<a href=#482 id=482 data-nosnippet>482</a>}
<a href=#483 id=483 data-nosnippet>483</a>
<a href=#484 id=484 data-nosnippet>484</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>register_dispatch(dispatch: <span class="kw-2">&amp;</span>Dispatch) {
<a href=#485 id=485 data-nosnippet>485</a> <span class="kw">let </span>dispatchers = DISPATCHERS.register_dispatch(dispatch);
<a href=#486 id=486 data-nosnippet>486</a> dispatch.subscriber().on_register_dispatch(dispatch);
<a href=#487 id=487 data-nosnippet>487</a> CALLSITES.rebuild_interest(dispatchers);
<a href=#488 id=488 data-nosnippet>488</a>}
<a href=#489 id=489 data-nosnippet>489</a>
<a href=#490 id=490 data-nosnippet>490</a><span class="kw">fn </span>rebuild_callsite_interest(
<a href=#491 id=491 data-nosnippet>491</a> callsite: <span class="kw-2">&amp;</span><span class="lifetime">'static </span><span class="kw">dyn </span>Callsite,
<a href=#492 id=492 data-nosnippet>492</a> dispatchers: <span class="kw-2">&amp;</span>dispatchers::Rebuilder&lt;<span class="lifetime">'_</span>&gt;,
<a href=#493 id=493 data-nosnippet>493</a>) {
<a href=#494 id=494 data-nosnippet>494</a> <span class="kw">let </span>meta = callsite.metadata();
<a href=#495 id=495 data-nosnippet>495</a>
<a href=#496 id=496 data-nosnippet>496</a> <span class="kw">let </span><span class="kw-2">mut </span>interest = <span class="prelude-val">None</span>;
<a href=#497 id=497 data-nosnippet>497</a> dispatchers.for_each(|dispatch| {
<a href=#498 id=498 data-nosnippet>498</a> <span class="kw">let </span>this_interest = dispatch.register_callsite(meta);
<a href=#499 id=499 data-nosnippet>499</a> interest = <span class="kw">match </span>interest.take() {
<a href=#500 id=500 data-nosnippet>500</a> <span class="prelude-val">None </span>=&gt; <span class="prelude-val">Some</span>(this_interest),
<a href=#501 id=501 data-nosnippet>501</a> <span class="prelude-val">Some</span>(that_interest) =&gt; <span class="prelude-val">Some</span>(that_interest.and(this_interest)),
<a href=#502 id=502 data-nosnippet>502</a> }
<a href=#503 id=503 data-nosnippet>503</a> });
<a href=#504 id=504 data-nosnippet>504</a>
<a href=#505 id=505 data-nosnippet>505</a> <span class="kw">let </span>interest = interest.unwrap_or_else(Interest::never);
<a href=#506 id=506 data-nosnippet>506</a> callsite.set_interest(interest)
<a href=#507 id=507 data-nosnippet>507</a>}
<a href=#508 id=508 data-nosnippet>508</a>
<a href=#509 id=509 data-nosnippet>509</a><span class="kw">mod </span>private {
<a href=#510 id=510 data-nosnippet>510</a> <span class="doccomment">/// Don't call this function, it's private.
<a href=#511 id=511 data-nosnippet>511</a> </span><span class="attr">#[allow(missing_debug_implementations)]
<a href=#512 id=512 data-nosnippet>512</a> </span><span class="kw">pub struct </span>Private&lt;T&gt;(<span class="kw">pub</span>(<span class="kw">crate</span>) T);
<a href=#513 id=513 data-nosnippet>513</a>}
<a href=#514 id=514 data-nosnippet>514</a>
<a href=#515 id=515 data-nosnippet>515</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#516 id=516 data-nosnippet>516</a></span><span class="kw">mod </span>dispatchers {
<a href=#517 id=517 data-nosnippet>517</a> <span class="kw">use crate</span>::{dispatcher, lazy::Lazy};
<a href=#518 id=518 data-nosnippet>518</a> <span class="kw">use </span>alloc::vec::Vec;
<a href=#519 id=519 data-nosnippet>519</a> <span class="kw">use </span>std::sync::{
<a href=#520 id=520 data-nosnippet>520</a> atomic::{AtomicBool, Ordering},
<a href=#521 id=521 data-nosnippet>521</a> RwLock, RwLockReadGuard, RwLockWriteGuard,
<a href=#522 id=522 data-nosnippet>522</a> };
<a href=#523 id=523 data-nosnippet>523</a>
<a href=#524 id=524 data-nosnippet>524</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">struct </span>Dispatchers {
<a href=#525 id=525 data-nosnippet>525</a> has_just_one: AtomicBool,
<a href=#526 id=526 data-nosnippet>526</a> }
<a href=#527 id=527 data-nosnippet>527</a>
<a href=#528 id=528 data-nosnippet>528</a> <span class="kw">static </span>LOCKED_DISPATCHERS: Lazy&lt;RwLock&lt;Vec&lt;dispatcher::Registrar&gt;&gt;&gt; =
<a href=#529 id=529 data-nosnippet>529</a> Lazy::new(Default::default);
<a href=#530 id=530 data-nosnippet>530</a>
<a href=#531 id=531 data-nosnippet>531</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">enum </span>Rebuilder&lt;<span class="lifetime">'a</span>&gt; {
<a href=#532 id=532 data-nosnippet>532</a> JustOne,
<a href=#533 id=533 data-nosnippet>533</a> Read(RwLockReadGuard&lt;<span class="lifetime">'a</span>, Vec&lt;dispatcher::Registrar&gt;&gt;),
<a href=#534 id=534 data-nosnippet>534</a> Write(RwLockWriteGuard&lt;<span class="lifetime">'a</span>, Vec&lt;dispatcher::Registrar&gt;&gt;),
<a href=#535 id=535 data-nosnippet>535</a> }
<a href=#536 id=536 data-nosnippet>536</a>
<a href=#537 id=537 data-nosnippet>537</a> <span class="kw">impl </span>Dispatchers {
<a href=#538 id=538 data-nosnippet>538</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">const fn </span>new() -&gt; <span class="self">Self </span>{
<a href=#539 id=539 data-nosnippet>539</a> <span class="self">Self </span>{
<a href=#540 id=540 data-nosnippet>540</a> has_just_one: AtomicBool::new(<span class="bool-val">true</span>),
<a href=#541 id=541 data-nosnippet>541</a> }
<a href=#542 id=542 data-nosnippet>542</a> }
<a href=#543 id=543 data-nosnippet>543</a>
<a href=#544 id=544 data-nosnippet>544</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>rebuilder(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; Rebuilder&lt;<span class="lifetime">'_</span>&gt; {
<a href=#545 id=545 data-nosnippet>545</a> <span class="kw">if </span><span class="self">self</span>.has_just_one.load(Ordering::SeqCst) {
<a href=#546 id=546 data-nosnippet>546</a> <span class="kw">return </span>Rebuilder::JustOne;
<a href=#547 id=547 data-nosnippet>547</a> }
<a href=#548 id=548 data-nosnippet>548</a> Rebuilder::Read(LOCKED_DISPATCHERS.read().unwrap())
<a href=#549 id=549 data-nosnippet>549</a> }
<a href=#550 id=550 data-nosnippet>550</a>
<a href=#551 id=551 data-nosnippet>551</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>register_dispatch(<span class="kw-2">&amp;</span><span class="self">self</span>, dispatch: <span class="kw-2">&amp;</span>dispatcher::Dispatch) -&gt; Rebuilder&lt;<span class="lifetime">'_</span>&gt; {
<a href=#552 id=552 data-nosnippet>552</a> <span class="kw">let </span><span class="kw-2">mut </span>dispatchers = LOCKED_DISPATCHERS.write().unwrap();
<a href=#553 id=553 data-nosnippet>553</a> dispatchers.retain(|d| d.upgrade().is_some());
<a href=#554 id=554 data-nosnippet>554</a> dispatchers.push(dispatch.registrar());
<a href=#555 id=555 data-nosnippet>555</a> <span class="self">self</span>.has_just_one
<a href=#556 id=556 data-nosnippet>556</a> .store(dispatchers.len() &lt;= <span class="number">1</span>, Ordering::SeqCst);
<a href=#557 id=557 data-nosnippet>557</a> Rebuilder::Write(dispatchers)
<a href=#558 id=558 data-nosnippet>558</a> }
<a href=#559 id=559 data-nosnippet>559</a> }
<a href=#560 id=560 data-nosnippet>560</a>
<a href=#561 id=561 data-nosnippet>561</a> <span class="kw">impl </span>Rebuilder&lt;<span class="lifetime">'_</span>&gt; {
<a href=#562 id=562 data-nosnippet>562</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>for_each(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="kw-2">mut </span>f: <span class="kw">impl </span>FnMut(<span class="kw-2">&amp;</span>dispatcher::Dispatch)) {
<a href=#563 id=563 data-nosnippet>563</a> <span class="kw">let </span>iter = <span class="kw">match </span><span class="self">self </span>{
<a href=#564 id=564 data-nosnippet>564</a> Rebuilder::JustOne =&gt; {
<a href=#565 id=565 data-nosnippet>565</a> dispatcher::get_default(f);
<a href=#566 id=566 data-nosnippet>566</a> <span class="kw">return</span>;
<a href=#567 id=567 data-nosnippet>567</a> }
<a href=#568 id=568 data-nosnippet>568</a> Rebuilder::Read(vec) =&gt; vec.iter(),
<a href=#569 id=569 data-nosnippet>569</a> Rebuilder::Write(vec) =&gt; vec.iter(),
<a href=#570 id=570 data-nosnippet>570</a> };
<a href=#571 id=571 data-nosnippet>571</a> iter.filter_map(dispatcher::Registrar::upgrade)
<a href=#572 id=572 data-nosnippet>572</a> .for_each(|dispatch| f(<span class="kw-2">&amp;</span>dispatch))
<a href=#573 id=573 data-nosnippet>573</a> }
<a href=#574 id=574 data-nosnippet>574</a> }
<a href=#575 id=575 data-nosnippet>575</a>}
<a href=#576 id=576 data-nosnippet>576</a>
<a href=#577 id=577 data-nosnippet>577</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#578 id=578 data-nosnippet>578</a></span><span class="kw">mod </span>dispatchers {
<a href=#579 id=579 data-nosnippet>579</a> <span class="kw">use </span><span class="kw">crate</span>::dispatcher;
<a href=#580 id=580 data-nosnippet>580</a>
<a href=#581 id=581 data-nosnippet>581</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">struct </span>Dispatchers(());
<a href=#582 id=582 data-nosnippet>582</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">struct </span>Rebuilder&lt;<span class="lifetime">'a</span>&gt;(<span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>dispatcher::Dispatch&gt;);
<a href=#583 id=583 data-nosnippet>583</a>
<a href=#584 id=584 data-nosnippet>584</a> <span class="kw">impl </span>Dispatchers {
<a href=#585 id=585 data-nosnippet>585</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">const fn </span>new() -&gt; <span class="self">Self </span>{
<a href=#586 id=586 data-nosnippet>586</a> <span class="self">Self</span>(())
<a href=#587 id=587 data-nosnippet>587</a> }
<a href=#588 id=588 data-nosnippet>588</a>
<a href=#589 id=589 data-nosnippet>589</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>rebuilder(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; Rebuilder&lt;<span class="lifetime">'_</span>&gt; {
<a href=#590 id=590 data-nosnippet>590</a> Rebuilder(<span class="prelude-val">None</span>)
<a href=#591 id=591 data-nosnippet>591</a> }
<a href=#592 id=592 data-nosnippet>592</a>
<a href=#593 id=593 data-nosnippet>593</a> <span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>register_dispatch&lt;<span class="lifetime">'dispatch</span>&gt;(
<a href=#594 id=594 data-nosnippet>594</a> <span class="kw-2">&amp;</span><span class="self">self</span>,
<a href=#595 id=595 data-nosnippet>595</a> dispatch: <span class="kw-2">&amp;</span><span class="lifetime">'dispatch </span>dispatcher::Dispatch,
<a href=#596 id=596 data-nosnippet>596</a> ) -&gt; Rebuilder&lt;<span class="lifetime">'dispatch</span>&gt; {
<a href=#597 id=597 data-nosnippet>597</a> <span class="comment">// nop; on no_std, there can only ever be one dispatcher
<a href=#598 id=598 data-nosnippet>598</a> </span>Rebuilder(<span class="prelude-val">Some</span>(dispatch))
<a href=#599 id=599 data-nosnippet>599</a> }
<a href=#600 id=600 data-nosnippet>600</a> }
<a href=#601 id=601 data-nosnippet>601</a>
<a href=#602 id=602 data-nosnippet>602</a> <span class="kw">impl </span>Rebuilder&lt;<span class="lifetime">'_</span>&gt; {
<a href=#603 id=603 data-nosnippet>603</a> <span class="attr">#[inline]
<a href=#604 id=604 data-nosnippet>604</a> </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">fn </span>for_each(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="kw-2">mut </span>f: <span class="kw">impl </span>FnMut(<span class="kw-2">&amp;</span>dispatcher::Dispatch)) {
<a href=#605 id=605 data-nosnippet>605</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(dispatch) = <span class="self">self</span>.<span class="number">0 </span>{
<a href=#606 id=606 data-nosnippet>606</a> <span class="comment">// we are rebuilding the interest cache because a new dispatcher
<a href=#607 id=607 data-nosnippet>607</a> // is about to be set. on `no_std`, this should only happen
<a href=#608 id=608 data-nosnippet>608</a> // once, because the new dispatcher will be the global default.
<a href=#609 id=609 data-nosnippet>609</a> </span>f(dispatch)
<a href=#610 id=610 data-nosnippet>610</a> } <span class="kw">else </span>{
<a href=#611 id=611 data-nosnippet>611</a> <span class="comment">// otherwise, we are rebuilding the cache because the subscriber
<a href=#612 id=612 data-nosnippet>612</a> // configuration changed, so use the global default.
<a href=#613 id=613 data-nosnippet>613</a> // on no_std, there can only ever be one dispatcher
<a href=#614 id=614 data-nosnippet>614</a> </span>dispatcher::get_default(f)
<a href=#615 id=615 data-nosnippet>615</a> }
<a href=#616 id=616 data-nosnippet>616</a> }
<a href=#617 id=617 data-nosnippet>617</a> }
<a href=#618 id=618 data-nosnippet>618</a>}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,129 @@
<!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/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-core-0.1.36/src/event.rs`."><title>event.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tracing_core" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="icon" href="https://raw.githubusercontent.com/tokio-rs/tracing/main/assets/favicon.ico"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">tracing_core/</div>event.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Events represent single points in time during the execution of a program.
<a href=#2 id=2 data-nosnippet>2</a></span><span class="kw">use </span><span class="kw">crate</span>::parent::Parent;
<a href=#3 id=3 data-nosnippet>3</a><span class="kw">use </span><span class="kw">crate</span>::span::Id;
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use crate</span>::{field, Metadata};
<a href=#5 id=5 data-nosnippet>5</a>
<a href=#6 id=6 data-nosnippet>6</a><span class="doccomment">/// `Event`s represent single points in time where something occurred during the
<a href=#7 id=7 data-nosnippet>7</a>/// execution of a program.
<a href=#8 id=8 data-nosnippet>8</a>///
<a href=#9 id=9 data-nosnippet>9</a>/// An `Event` can be compared to a log record in unstructured logging, but with
<a href=#10 id=10 data-nosnippet>10</a>/// two key differences:
<a href=#11 id=11 data-nosnippet>11</a>/// - `Event`s exist _within the context of a [span]_. Unlike log lines, they
<a href=#12 id=12 data-nosnippet>12</a>/// may be located within the trace tree, allowing visibility into the
<a href=#13 id=13 data-nosnippet>13</a>/// _temporal_ context in which the event occurred, as well as the source
<a href=#14 id=14 data-nosnippet>14</a>/// code location.
<a href=#15 id=15 data-nosnippet>15</a>/// - Like spans, `Event`s have structured key-value data known as _[fields]_,
<a href=#16 id=16 data-nosnippet>16</a>/// which may include textual message. In general, a majority of the data
<a href=#17 id=17 data-nosnippet>17</a>/// associated with an event should be in the event's fields rather than in
<a href=#18 id=18 data-nosnippet>18</a>/// the textual message, as the fields are more structured.
<a href=#19 id=19 data-nosnippet>19</a>///
<a href=#20 id=20 data-nosnippet>20</a>/// [span]: super::span
<a href=#21 id=21 data-nosnippet>21</a>/// [fields]: super::field
<a href=#22 id=22 data-nosnippet>22</a></span><span class="attr">#[derive(Debug)]
<a href=#23 id=23 data-nosnippet>23</a></span><span class="kw">pub struct </span>Event&lt;<span class="lifetime">'a</span>&gt; {
<a href=#24 id=24 data-nosnippet>24</a> fields: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt;,
<a href=#25 id=25 data-nosnippet>25</a> metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;,
<a href=#26 id=26 data-nosnippet>26</a> parent: Parent,
<a href=#27 id=27 data-nosnippet>27</a>}
<a href=#28 id=28 data-nosnippet>28</a>
<a href=#29 id=29 data-nosnippet>29</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; Event&lt;<span class="lifetime">'a</span>&gt; {
<a href=#30 id=30 data-nosnippet>30</a> <span class="doccomment">/// Constructs a new `Event` with the specified metadata and set of values,
<a href=#31 id=31 data-nosnippet>31</a> /// and observes it with the current subscriber.
<a href=#32 id=32 data-nosnippet>32</a> </span><span class="kw">pub fn </span>dispatch(metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;, fields: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'_</span>&gt;) {
<a href=#33 id=33 data-nosnippet>33</a> <span class="kw">let </span>event = Event::new(metadata, fields);
<a href=#34 id=34 data-nosnippet>34</a> <span class="kw">crate</span>::dispatcher::get_default(|current| {
<a href=#35 id=35 data-nosnippet>35</a> current.event(<span class="kw-2">&amp;</span>event);
<a href=#36 id=36 data-nosnippet>36</a> });
<a href=#37 id=37 data-nosnippet>37</a> }
<a href=#38 id=38 data-nosnippet>38</a>
<a href=#39 id=39 data-nosnippet>39</a> <span class="doccomment">/// Returns a new `Event` in the current span, with the specified metadata
<a href=#40 id=40 data-nosnippet>40</a> /// and set of values.
<a href=#41 id=41 data-nosnippet>41</a> </span><span class="attr">#[inline]
<a href=#42 id=42 data-nosnippet>42</a> </span><span class="kw">pub fn </span>new(metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;, fields: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#43 id=43 data-nosnippet>43</a> Event {
<a href=#44 id=44 data-nosnippet>44</a> fields,
<a href=#45 id=45 data-nosnippet>45</a> metadata,
<a href=#46 id=46 data-nosnippet>46</a> parent: Parent::Current,
<a href=#47 id=47 data-nosnippet>47</a> }
<a href=#48 id=48 data-nosnippet>48</a> }
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a> <span class="doccomment">/// Returns a new `Event` as a child of the specified span, with the
<a href=#51 id=51 data-nosnippet>51</a> /// provided metadata and set of values.
<a href=#52 id=52 data-nosnippet>52</a> </span><span class="attr">#[inline]
<a href=#53 id=53 data-nosnippet>53</a> </span><span class="kw">pub fn </span>new_child_of(
<a href=#54 id=54 data-nosnippet>54</a> parent: <span class="kw">impl </span>Into&lt;<span class="prelude-ty">Option</span>&lt;Id&gt;&gt;,
<a href=#55 id=55 data-nosnippet>55</a> metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;,
<a href=#56 id=56 data-nosnippet>56</a> fields: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt;,
<a href=#57 id=57 data-nosnippet>57</a> ) -&gt; <span class="self">Self </span>{
<a href=#58 id=58 data-nosnippet>58</a> <span class="kw">let </span>parent = <span class="kw">match </span>parent.into() {
<a href=#59 id=59 data-nosnippet>59</a> <span class="prelude-val">Some</span>(p) =&gt; Parent::Explicit(p),
<a href=#60 id=60 data-nosnippet>60</a> <span class="prelude-val">None </span>=&gt; Parent::Root,
<a href=#61 id=61 data-nosnippet>61</a> };
<a href=#62 id=62 data-nosnippet>62</a> Event {
<a href=#63 id=63 data-nosnippet>63</a> fields,
<a href=#64 id=64 data-nosnippet>64</a> metadata,
<a href=#65 id=65 data-nosnippet>65</a> parent,
<a href=#66 id=66 data-nosnippet>66</a> }
<a href=#67 id=67 data-nosnippet>67</a> }
<a href=#68 id=68 data-nosnippet>68</a>
<a href=#69 id=69 data-nosnippet>69</a> <span class="doccomment">/// Constructs a new `Event` with the specified metadata and set of values,
<a href=#70 id=70 data-nosnippet>70</a> /// and observes it with the current subscriber and an explicit parent.
<a href=#71 id=71 data-nosnippet>71</a> </span><span class="kw">pub fn </span>child_of(
<a href=#72 id=72 data-nosnippet>72</a> parent: <span class="kw">impl </span>Into&lt;<span class="prelude-ty">Option</span>&lt;Id&gt;&gt;,
<a href=#73 id=73 data-nosnippet>73</a> metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;,
<a href=#74 id=74 data-nosnippet>74</a> fields: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'_</span>&gt;,
<a href=#75 id=75 data-nosnippet>75</a> ) {
<a href=#76 id=76 data-nosnippet>76</a> <span class="kw">let </span>event = <span class="self">Self</span>::new_child_of(parent, metadata, fields);
<a href=#77 id=77 data-nosnippet>77</a> <span class="kw">crate</span>::dispatcher::get_default(|current| {
<a href=#78 id=78 data-nosnippet>78</a> current.event(<span class="kw-2">&amp;</span>event);
<a href=#79 id=79 data-nosnippet>79</a> });
<a href=#80 id=80 data-nosnippet>80</a> }
<a href=#81 id=81 data-nosnippet>81</a>
<a href=#82 id=82 data-nosnippet>82</a> <span class="doccomment">/// Visits all the fields on this `Event` with the specified [visitor].
<a href=#83 id=83 data-nosnippet>83</a> ///
<a href=#84 id=84 data-nosnippet>84</a> /// [visitor]: super::field::Visit
<a href=#85 id=85 data-nosnippet>85</a> </span><span class="attr">#[inline]
<a href=#86 id=86 data-nosnippet>86</a> </span><span class="kw">pub fn </span>record(<span class="kw-2">&amp;</span><span class="self">self</span>, visitor: <span class="kw-2">&amp;mut </span><span class="kw">dyn </span>field::Visit) {
<a href=#87 id=87 data-nosnippet>87</a> <span class="self">self</span>.fields.record(visitor);
<a href=#88 id=88 data-nosnippet>88</a> }
<a href=#89 id=89 data-nosnippet>89</a>
<a href=#90 id=90 data-nosnippet>90</a> <span class="doccomment">/// Returns an iterator over the set of values on this `Event`.
<a href=#91 id=91 data-nosnippet>91</a> </span><span class="kw">pub fn </span>fields(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; field::Iter {
<a href=#92 id=92 data-nosnippet>92</a> <span class="self">self</span>.fields.field_set().iter()
<a href=#93 id=93 data-nosnippet>93</a> }
<a href=#94 id=94 data-nosnippet>94</a>
<a href=#95 id=95 data-nosnippet>95</a> <span class="doccomment">/// Returns [metadata] describing this `Event`.
<a href=#96 id=96 data-nosnippet>96</a> ///
<a href=#97 id=97 data-nosnippet>97</a> /// [metadata]: super::Metadata
<a href=#98 id=98 data-nosnippet>98</a> </span><span class="kw">pub fn </span>metadata(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt; {
<a href=#99 id=99 data-nosnippet>99</a> <span class="self">self</span>.metadata
<a href=#100 id=100 data-nosnippet>100</a> }
<a href=#101 id=101 data-nosnippet>101</a>
<a href=#102 id=102 data-nosnippet>102</a> <span class="doccomment">/// Returns true if the new event should be a root.
<a href=#103 id=103 data-nosnippet>103</a> </span><span class="kw">pub fn </span>is_root(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#104 id=104 data-nosnippet>104</a> <span class="macro">matches!</span>(<span class="self">self</span>.parent, Parent::Root)
<a href=#105 id=105 data-nosnippet>105</a> }
<a href=#106 id=106 data-nosnippet>106</a>
<a href=#107 id=107 data-nosnippet>107</a> <span class="doccomment">/// Returns true if the new event's parent should be determined based on the
<a href=#108 id=108 data-nosnippet>108</a> /// current context.
<a href=#109 id=109 data-nosnippet>109</a> ///
<a href=#110 id=110 data-nosnippet>110</a> /// If this is true and the current thread is currently inside a span, then
<a href=#111 id=111 data-nosnippet>111</a> /// that span should be the new event's parent. Otherwise, if the current
<a href=#112 id=112 data-nosnippet>112</a> /// thread is _not_ inside a span, then the new event will be the root of its
<a href=#113 id=113 data-nosnippet>113</a> /// own trace tree.
<a href=#114 id=114 data-nosnippet>114</a> </span><span class="kw">pub fn </span>is_contextual(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#115 id=115 data-nosnippet>115</a> <span class="macro">matches!</span>(<span class="self">self</span>.parent, Parent::Current)
<a href=#116 id=116 data-nosnippet>116</a> }
<a href=#117 id=117 data-nosnippet>117</a>
<a href=#118 id=118 data-nosnippet>118</a> <span class="doccomment">/// Returns the new event's explicitly-specified parent, if there is one.
<a href=#119 id=119 data-nosnippet>119</a> ///
<a href=#120 id=120 data-nosnippet>120</a> /// Otherwise (if the new event is a root or is a child of the current span),
<a href=#121 id=121 data-nosnippet>121</a> /// returns `None`.
<a href=#122 id=122 data-nosnippet>122</a> </span><span class="kw">pub fn </span>parent(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>Id&gt; {
<a href=#123 id=123 data-nosnippet>123</a> <span class="kw">match </span><span class="self">self</span>.parent {
<a href=#124 id=124 data-nosnippet>124</a> Parent::Explicit(<span class="kw-2">ref </span>p) =&gt; <span class="prelude-val">Some</span>(p),
<a href=#125 id=125 data-nosnippet>125</a> <span class="kw">_ </span>=&gt; <span class="prelude-val">None</span>,
<a href=#126 id=126 data-nosnippet>126</a> }
<a href=#127 id=127 data-nosnippet>127</a> }
<a href=#128 id=128 data-nosnippet>128</a>}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,77 @@
<!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/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-core-0.1.36/src/lazy.rs`."><title>lazy.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tracing_core" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="icon" href="https://raw.githubusercontent.com/tokio-rs/tracing/main/assets/favicon.ico"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">tracing_core/</div>lazy.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-2"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#2 id=2 data-nosnippet>2</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">use </span>once_cell::sync::Lazy;
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#5 id=5 data-nosnippet>5</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">use </span><span class="self">self</span>::spin::Lazy;
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#8 id=8 data-nosnippet>8</a></span><span class="kw">mod </span>spin {
<a href=#9 id=9 data-nosnippet>9</a> <span class="doccomment">//! This is the `once_cell::sync::Lazy` type, but modified to use our
<a href=#10 id=10 data-nosnippet>10</a> //! `spin::Once` type rather than `OnceCell`. This is used to replace
<a href=#11 id=11 data-nosnippet>11</a> //! `once_cell::sync::Lazy` on `no-std` builds.
<a href=#12 id=12 data-nosnippet>12</a> </span><span class="kw">use </span><span class="kw">crate</span>::spin::Once;
<a href=#13 id=13 data-nosnippet>13</a> <span class="kw">use </span>core::{cell::Cell, fmt, ops::Deref};
<a href=#14 id=14 data-nosnippet>14</a>
<a href=#15 id=15 data-nosnippet>15</a> <span class="doccomment">/// Re-implementation of `once_cell::sync::Lazy` on top of `spin::Once`
<a href=#16 id=16 data-nosnippet>16</a> /// rather than `OnceCell`.
<a href=#17 id=17 data-nosnippet>17</a> ///
<a href=#18 id=18 data-nosnippet>18</a> /// This is used when the standard library is disabled.
<a href=#19 id=19 data-nosnippet>19</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">struct </span>Lazy&lt;T, F = <span class="kw">fn</span>() -&gt; T&gt; {
<a href=#20 id=20 data-nosnippet>20</a> cell: Once&lt;T&gt;,
<a href=#21 id=21 data-nosnippet>21</a> init: Cell&lt;<span class="prelude-ty">Option</span>&lt;F&gt;&gt;,
<a href=#22 id=22 data-nosnippet>22</a> }
<a href=#23 id=23 data-nosnippet>23</a>
<a href=#24 id=24 data-nosnippet>24</a> <span class="kw">impl</span>&lt;T: fmt::Debug, F&gt; fmt::Debug <span class="kw">for </span>Lazy&lt;T, F&gt; {
<a href=#25 id=25 data-nosnippet>25</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#26 id=26 data-nosnippet>26</a> f.debug_struct(<span class="string">"Lazy"</span>)
<a href=#27 id=27 data-nosnippet>27</a> .field(<span class="string">"cell"</span>, <span class="kw-2">&amp;</span><span class="self">self</span>.cell)
<a href=#28 id=28 data-nosnippet>28</a> .field(<span class="string">"init"</span>, <span class="kw-2">&amp;</span><span class="string">".."</span>)
<a href=#29 id=29 data-nosnippet>29</a> .finish()
<a href=#30 id=30 data-nosnippet>30</a> }
<a href=#31 id=31 data-nosnippet>31</a> }
<a href=#32 id=32 data-nosnippet>32</a>
<a href=#33 id=33 data-nosnippet>33</a> <span class="comment">// We never create a `&amp;F` from a `&amp;Lazy&lt;T, F&gt;` so it is fine to not impl
<a href=#34 id=34 data-nosnippet>34</a> // `Sync` for `F`. We do create a `&amp;mut Option&lt;F&gt;` in `force`, but this is
<a href=#35 id=35 data-nosnippet>35</a> // properly synchronized, so it only happens once so it also does not
<a href=#36 id=36 data-nosnippet>36</a> // contribute to this impl.
<a href=#37 id=37 data-nosnippet>37</a> </span><span class="kw">unsafe impl</span>&lt;T, F: Send&gt; Sync <span class="kw">for </span>Lazy&lt;T, F&gt; <span class="kw">where </span>Once&lt;T&gt;: Sync {}
<a href=#38 id=38 data-nosnippet>38</a> <span class="comment">// auto-derived `Send` impl is OK.
<a href=#39 id=39 data-nosnippet>39</a>
<a href=#40 id=40 data-nosnippet>40</a> </span><span class="kw">impl</span>&lt;T, F&gt; Lazy&lt;T, F&gt; {
<a href=#41 id=41 data-nosnippet>41</a> <span class="doccomment">/// Creates a new lazy value with the given initializing function.
<a href=#42 id=42 data-nosnippet>42</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const fn </span>new(init: F) -&gt; Lazy&lt;T, F&gt; {
<a href=#43 id=43 data-nosnippet>43</a> Lazy {
<a href=#44 id=44 data-nosnippet>44</a> cell: Once::new(),
<a href=#45 id=45 data-nosnippet>45</a> init: Cell::new(<span class="prelude-val">Some</span>(init)),
<a href=#46 id=46 data-nosnippet>46</a> }
<a href=#47 id=47 data-nosnippet>47</a> }
<a href=#48 id=48 data-nosnippet>48</a> }
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a> <span class="kw">impl</span>&lt;T, F: FnOnce() -&gt; T&gt; Lazy&lt;T, F&gt; {
<a href=#51 id=51 data-nosnippet>51</a> <span class="doccomment">/// Forces the evaluation of this lazy value and returns a reference to
<a href=#52 id=52 data-nosnippet>52</a> /// the result.
<a href=#53 id=53 data-nosnippet>53</a> ///
<a href=#54 id=54 data-nosnippet>54</a> /// This is equivalent to the `Deref` impl, but is explicit.
<a href=#55 id=55 data-nosnippet>55</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>force(this: <span class="kw-2">&amp;</span>Lazy&lt;T, F&gt;) -&gt; <span class="kw-2">&amp;</span>T {
<a href=#56 id=56 data-nosnippet>56</a> this.cell.call_once(|| <span class="kw">match </span>this.init.take() {
<a href=#57 id=57 data-nosnippet>57</a> <span class="prelude-val">Some</span>(f) =&gt; f(),
<a href=#58 id=58 data-nosnippet>58</a> <span class="prelude-val">None </span>=&gt; <span class="macro">panic!</span>(<span class="string">"Lazy instance has previously been poisoned"</span>),
<a href=#59 id=59 data-nosnippet>59</a> })
<a href=#60 id=60 data-nosnippet>60</a> }
<a href=#61 id=61 data-nosnippet>61</a> }
<a href=#62 id=62 data-nosnippet>62</a>
<a href=#63 id=63 data-nosnippet>63</a> <span class="kw">impl</span>&lt;T, F: FnOnce() -&gt; T&gt; Deref <span class="kw">for </span>Lazy&lt;T, F&gt; {
<a href=#64 id=64 data-nosnippet>64</a> <span class="kw">type </span>Target = T;
<a href=#65 id=65 data-nosnippet>65</a> <span class="kw">fn </span>deref(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>T {
<a href=#66 id=66 data-nosnippet>66</a> Lazy::force(<span class="self">self</span>)
<a href=#67 id=67 data-nosnippet>67</a> }
<a href=#68 id=68 data-nosnippet>68</a> }
<a href=#69 id=69 data-nosnippet>69</a>
<a href=#70 id=70 data-nosnippet>70</a> <span class="kw">impl</span>&lt;T: Default&gt; Default <span class="kw">for </span>Lazy&lt;T&gt; {
<a href=#71 id=71 data-nosnippet>71</a> <span class="doccomment">/// Creates a new lazy value using `Default` as the initializing function.
<a href=#72 id=72 data-nosnippet>72</a> </span><span class="kw">fn </span>default() -&gt; Lazy&lt;T&gt; {
<a href=#73 id=73 data-nosnippet>73</a> Lazy::new(T::default)
<a href=#74 id=74 data-nosnippet>74</a> }
<a href=#75 id=75 data-nosnippet>75</a> }
<a href=#76 id=76 data-nosnippet>76</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,312 @@
<!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/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-core-0.1.36/src/lib.rs`."><title>lib.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tracing_core" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="icon" href="https://raw.githubusercontent.com/tokio-rs/tracing/main/assets/favicon.ico"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">tracing_core/</div>lib.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Core primitives for `tracing`.
<a href=#2 id=2 data-nosnippet>2</a>//!
<a href=#3 id=3 data-nosnippet>3</a>//! [`tracing`] is a framework for instrumenting Rust programs to collect
<a href=#4 id=4 data-nosnippet>4</a>//! structured, event-based diagnostic information. This crate defines the core
<a href=#5 id=5 data-nosnippet>5</a>//! primitives of `tracing`.
<a href=#6 id=6 data-nosnippet>6</a>//!
<a href=#7 id=7 data-nosnippet>7</a>//! This crate provides:
<a href=#8 id=8 data-nosnippet>8</a>//!
<a href=#9 id=9 data-nosnippet>9</a>//! * [`span::Id`] identifies a span within the execution of a program.
<a href=#10 id=10 data-nosnippet>10</a>//!
<a href=#11 id=11 data-nosnippet>11</a>//! * [`Event`] represents a single event within a trace.
<a href=#12 id=12 data-nosnippet>12</a>//!
<a href=#13 id=13 data-nosnippet>13</a>//! * [`Subscriber`], the trait implemented to collect trace data.
<a href=#14 id=14 data-nosnippet>14</a>//!
<a href=#15 id=15 data-nosnippet>15</a>//! * [`Metadata`] and [`Callsite`] provide information describing spans and
<a href=#16 id=16 data-nosnippet>16</a>//! `Event`s.
<a href=#17 id=17 data-nosnippet>17</a>//!
<a href=#18 id=18 data-nosnippet>18</a>//! * [`Field`], [`FieldSet`], [`Value`], and [`ValueSet`] represent the
<a href=#19 id=19 data-nosnippet>19</a>//! structured data attached to a span.
<a href=#20 id=20 data-nosnippet>20</a>//!
<a href=#21 id=21 data-nosnippet>21</a>//! * [`Dispatch`] allows spans and events to be dispatched to `Subscriber`s.
<a href=#22 id=22 data-nosnippet>22</a>//!
<a href=#23 id=23 data-nosnippet>23</a>//! In addition, it defines the global callsite registry and per-thread current
<a href=#24 id=24 data-nosnippet>24</a>//! dispatcher which other components of the tracing system rely on.
<a href=#25 id=25 data-nosnippet>25</a>//!
<a href=#26 id=26 data-nosnippet>26</a>//! *Compiler support: [requires `rustc` 1.65+][msrv]*
<a href=#27 id=27 data-nosnippet>27</a>//!
<a href=#28 id=28 data-nosnippet>28</a>//! [msrv]: #supported-rust-versions
<a href=#29 id=29 data-nosnippet>29</a>//!
<a href=#30 id=30 data-nosnippet>30</a>//! ## Usage
<a href=#31 id=31 data-nosnippet>31</a>//!
<a href=#32 id=32 data-nosnippet>32</a>//! Application authors will typically not use this crate directly. Instead,
<a href=#33 id=33 data-nosnippet>33</a>//! they will use the [`tracing`] crate, which provides a much more
<a href=#34 id=34 data-nosnippet>34</a>//! fully-featured API. However, this crate's API will change very infrequently,
<a href=#35 id=35 data-nosnippet>35</a>//! so it may be used when dependencies must be very stable.
<a href=#36 id=36 data-nosnippet>36</a>//!
<a href=#37 id=37 data-nosnippet>37</a>//! `Subscriber` implementations may depend on `tracing-core` rather than
<a href=#38 id=38 data-nosnippet>38</a>//! `tracing`, as the additional APIs provided by `tracing` are primarily useful
<a href=#39 id=39 data-nosnippet>39</a>//! for instrumenting libraries and applications, and are generally not
<a href=#40 id=40 data-nosnippet>40</a>//! necessary for `Subscriber` implementations.
<a href=#41 id=41 data-nosnippet>41</a>//!
<a href=#42 id=42 data-nosnippet>42</a>//! The [`tokio-rs/tracing`] repository contains less stable crates designed to
<a href=#43 id=43 data-nosnippet>43</a>//! be used with the `tracing` ecosystem. It includes a collection of
<a href=#44 id=44 data-nosnippet>44</a>//! `Subscriber` implementations, as well as utility and adapter crates.
<a href=#45 id=45 data-nosnippet>45</a>//!
<a href=#46 id=46 data-nosnippet>46</a>//! ## Crate Feature Flags
<a href=#47 id=47 data-nosnippet>47</a>//!
<a href=#48 id=48 data-nosnippet>48</a>//! The following crate [feature flags] are available:
<a href=#49 id=49 data-nosnippet>49</a>//!
<a href=#50 id=50 data-nosnippet>50</a>//! * `std`: Depend on the Rust standard library (enabled by default).
<a href=#51 id=51 data-nosnippet>51</a>//!
<a href=#52 id=52 data-nosnippet>52</a>//! `no_std` users may disable this feature with `default-features = false`:
<a href=#53 id=53 data-nosnippet>53</a>//!
<a href=#54 id=54 data-nosnippet>54</a>//! ```toml
<a href=#55 id=55 data-nosnippet>55</a>//! [dependencies]
<a href=#56 id=56 data-nosnippet>56</a>//! tracing-core = { version = "0.1.22", default-features = false }
<a href=#57 id=57 data-nosnippet>57</a>//! ```
<a href=#58 id=58 data-nosnippet>58</a>//!
<a href=#59 id=59 data-nosnippet>59</a>//! **Note**:`tracing-core`'s `no_std` support requires `liballoc`.
<a href=#60 id=60 data-nosnippet>60</a>//!
<a href=#61 id=61 data-nosnippet>61</a>//! ### Unstable Features
<a href=#62 id=62 data-nosnippet>62</a>//!
<a href=#63 id=63 data-nosnippet>63</a>//! These feature flags enable **unstable** features. The public API may break in 0.1.x
<a href=#64 id=64 data-nosnippet>64</a>//! releases. To enable these features, the `--cfg tracing_unstable` must be passed to
<a href=#65 id=65 data-nosnippet>65</a>//! `rustc` when compiling.
<a href=#66 id=66 data-nosnippet>66</a>//!
<a href=#67 id=67 data-nosnippet>67</a>//! The following unstable feature flags are currently available:
<a href=#68 id=68 data-nosnippet>68</a>//!
<a href=#69 id=69 data-nosnippet>69</a>//! * `valuable`: Enables support for recording [field values] using the
<a href=#70 id=70 data-nosnippet>70</a>//! [`valuable`] crate.
<a href=#71 id=71 data-nosnippet>71</a>//!
<a href=#72 id=72 data-nosnippet>72</a>//! #### Enabling Unstable Features
<a href=#73 id=73 data-nosnippet>73</a>//!
<a href=#74 id=74 data-nosnippet>74</a>//! The easiest way to set the `tracing_unstable` cfg is to use the `RUSTFLAGS`
<a href=#75 id=75 data-nosnippet>75</a>//! env variable when running `cargo` commands:
<a href=#76 id=76 data-nosnippet>76</a>//!
<a href=#77 id=77 data-nosnippet>77</a>//! ```shell
<a href=#78 id=78 data-nosnippet>78</a>//! RUSTFLAGS="--cfg tracing_unstable" cargo build
<a href=#79 id=79 data-nosnippet>79</a>//! ```
<a href=#80 id=80 data-nosnippet>80</a>//! Alternatively, the following can be added to the `.cargo/config` file in a
<a href=#81 id=81 data-nosnippet>81</a>//! project to automatically enable the cfg flag for that project:
<a href=#82 id=82 data-nosnippet>82</a>//!
<a href=#83 id=83 data-nosnippet>83</a>//! ```toml
<a href=#84 id=84 data-nosnippet>84</a>//! [build]
<a href=#85 id=85 data-nosnippet>85</a>//! rustflags = ["--cfg", "tracing_unstable"]
<a href=#86 id=86 data-nosnippet>86</a>//! ```
<a href=#87 id=87 data-nosnippet>87</a>//!
<a href=#88 id=88 data-nosnippet>88</a>//! [feature flags]: https://doc.rust-lang.org/cargo/reference/manifest.html#the-features-section
<a href=#89 id=89 data-nosnippet>89</a>//! [field values]: crate::field
<a href=#90 id=90 data-nosnippet>90</a>//! [`valuable`]: https://crates.io/crates/valuable
<a href=#91 id=91 data-nosnippet>91</a>//!
<a href=#92 id=92 data-nosnippet>92</a>//! ## Supported Rust Versions
<a href=#93 id=93 data-nosnippet>93</a>//!
<a href=#94 id=94 data-nosnippet>94</a>//! Tracing is built against the latest stable release. The minimum supported
<a href=#95 id=95 data-nosnippet>95</a>//! version is 1.65. The current Tracing version is not guaranteed to build on
<a href=#96 id=96 data-nosnippet>96</a>//! Rust versions earlier than the minimum supported version.
<a href=#97 id=97 data-nosnippet>97</a>//!
<a href=#98 id=98 data-nosnippet>98</a>//! Tracing follows the same compiler support policies as the rest of the Tokio
<a href=#99 id=99 data-nosnippet>99</a>//! project. The current stable Rust compiler and the three most recent minor
<a href=#100 id=100 data-nosnippet>100</a>//! versions before it will always be supported. For example, if the current
<a href=#101 id=101 data-nosnippet>101</a>//! stable compiler version is 1.69, the minimum supported version will not be
<a href=#102 id=102 data-nosnippet>102</a>//! increased past 1.66, three minor versions prior. Increasing the minimum
<a href=#103 id=103 data-nosnippet>103</a>//! supported compiler version is not considered a semver breaking change as
<a href=#104 id=104 data-nosnippet>104</a>//! long as doing so complies with this policy.
<a href=#105 id=105 data-nosnippet>105</a>//!
<a href=#106 id=106 data-nosnippet>106</a>//!
<a href=#107 id=107 data-nosnippet>107</a>//! [`span::Id`]: span::Id
<a href=#108 id=108 data-nosnippet>108</a>//! [`Event`]: event::Event
<a href=#109 id=109 data-nosnippet>109</a>//! [`Subscriber`]: subscriber::Subscriber
<a href=#110 id=110 data-nosnippet>110</a>//! [`Metadata`]: metadata::Metadata
<a href=#111 id=111 data-nosnippet>111</a>//! [`Callsite`]: callsite::Callsite
<a href=#112 id=112 data-nosnippet>112</a>//! [`Field`]: field::Field
<a href=#113 id=113 data-nosnippet>113</a>//! [`FieldSet`]: field::FieldSet
<a href=#114 id=114 data-nosnippet>114</a>//! [`Value`]: field::Value
<a href=#115 id=115 data-nosnippet>115</a>//! [`ValueSet`]: field::ValueSet
<a href=#116 id=116 data-nosnippet>116</a>//! [`Dispatch`]: dispatcher::Dispatch
<a href=#117 id=117 data-nosnippet>117</a>//! [`tokio-rs/tracing`]: https://github.com/tokio-rs/tracing
<a href=#118 id=118 data-nosnippet>118</a>//! [`tracing`]: https://crates.io/crates/tracing
<a href=#119 id=119 data-nosnippet>119</a>
<a href=#120 id=120 data-nosnippet>120</a></span><span class="attr">#![no_std]
<a href=#121 id=121 data-nosnippet>121</a>#![doc(
<a href=#122 id=122 data-nosnippet>122</a> html_logo_url = <span class="string">"https://raw.githubusercontent.com/tokio-rs/tracing/main/assets/logo-type.png"</span>,
<a href=#123 id=123 data-nosnippet>123</a> html_favicon_url = <span class="string">"https://raw.githubusercontent.com/tokio-rs/tracing/main/assets/favicon.ico"</span>,
<a href=#124 id=124 data-nosnippet>124</a> issue_tracker_base_url = <span class="string">"https://github.com/tokio-rs/tracing/issues/"
<a href=#125 id=125 data-nosnippet>125</a></span>)]
<a href=#126 id=126 data-nosnippet>126</a>#![cfg_attr(docsrs, feature(doc_cfg), deny(rustdoc::broken_intra_doc_links))]
<a href=#127 id=127 data-nosnippet>127</a>#![warn(
<a href=#128 id=128 data-nosnippet>128</a> missing_debug_implementations,
<a href=#129 id=129 data-nosnippet>129</a> missing_docs,
<a href=#130 id=130 data-nosnippet>130</a> rust_2018_idioms,
<a href=#131 id=131 data-nosnippet>131</a> unreachable_pub,
<a href=#132 id=132 data-nosnippet>132</a> bad_style,
<a href=#133 id=133 data-nosnippet>133</a> dead_code,
<a href=#134 id=134 data-nosnippet>134</a> improper_ctypes,
<a href=#135 id=135 data-nosnippet>135</a> non_shorthand_field_patterns,
<a href=#136 id=136 data-nosnippet>136</a> no_mangle_generic_items,
<a href=#137 id=137 data-nosnippet>137</a> overflowing_literals,
<a href=#138 id=138 data-nosnippet>138</a> path_statements,
<a href=#139 id=139 data-nosnippet>139</a> patterns_in_fns_without_body,
<a href=#140 id=140 data-nosnippet>140</a> private_interfaces,
<a href=#141 id=141 data-nosnippet>141</a> private_bounds,
<a href=#142 id=142 data-nosnippet>142</a> unconditional_recursion,
<a href=#143 id=143 data-nosnippet>143</a> unused,
<a href=#144 id=144 data-nosnippet>144</a> unused_allocation,
<a href=#145 id=145 data-nosnippet>145</a> unused_comparisons,
<a href=#146 id=146 data-nosnippet>146</a> unused_parens,
<a href=#147 id=147 data-nosnippet>147</a> while_true
<a href=#148 id=148 data-nosnippet>148</a>)]
<a href=#149 id=149 data-nosnippet>149</a>
<a href=#150 id=150 data-nosnippet>150</a></span><span class="kw">extern crate </span>alloc;
<a href=#151 id=151 data-nosnippet>151</a>
<a href=#152 id=152 data-nosnippet>152</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#153 id=153 data-nosnippet>153</a></span><span class="kw">extern crate </span>std;
<a href=#154 id=154 data-nosnippet>154</a>
<a href=#155 id=155 data-nosnippet>155</a><span class="attr">#[doc(hidden)]
<a href=#156 id=156 data-nosnippet>156</a></span><span class="kw">pub mod </span>__macro_support {
<a href=#157 id=157 data-nosnippet>157</a> <span class="comment">// Re-export the `core` functions that are used in macros. This allows
<a href=#158 id=158 data-nosnippet>158</a> // a crate to be named `core` and avoid name clashes.
<a href=#159 id=159 data-nosnippet>159</a> // See here: https://github.com/tokio-rs/tracing/issues/2761
<a href=#160 id=160 data-nosnippet>160</a> </span><span class="kw">pub use </span>core::{file, line, module_path, option::Option};
<a href=#161 id=161 data-nosnippet>161</a>}
<a href=#162 id=162 data-nosnippet>162</a>
<a href=#163 id=163 data-nosnippet>163</a><span class="doccomment">/// Statically constructs an [`Identifier`] for the provided [`Callsite`].
<a href=#164 id=164 data-nosnippet>164</a>///
<a href=#165 id=165 data-nosnippet>165</a>/// This may be used in contexts such as static initializers.
<a href=#166 id=166 data-nosnippet>166</a>///
<a href=#167 id=167 data-nosnippet>167</a>/// For example:
<a href=#168 id=168 data-nosnippet>168</a>/// ```rust
<a href=#169 id=169 data-nosnippet>169</a>/// use tracing_core::{callsite, identify_callsite};
<a href=#170 id=170 data-nosnippet>170</a>/// # use tracing_core::{Metadata, subscriber::Interest};
<a href=#171 id=171 data-nosnippet>171</a>/// # fn main() {
<a href=#172 id=172 data-nosnippet>172</a>/// pub struct MyCallsite {
<a href=#173 id=173 data-nosnippet>173</a>/// // ...
<a href=#174 id=174 data-nosnippet>174</a>/// }
<a href=#175 id=175 data-nosnippet>175</a>/// impl callsite::Callsite for MyCallsite {
<a href=#176 id=176 data-nosnippet>176</a>/// # fn set_interest(&amp;self, _: Interest) { unimplemented!() }
<a href=#177 id=177 data-nosnippet>177</a>/// # fn metadata(&amp;self) -&gt; &amp;Metadata { unimplemented!() }
<a href=#178 id=178 data-nosnippet>178</a>/// // ...
<a href=#179 id=179 data-nosnippet>179</a>/// }
<a href=#180 id=180 data-nosnippet>180</a>///
<a href=#181 id=181 data-nosnippet>181</a>/// static CALLSITE: MyCallsite = MyCallsite {
<a href=#182 id=182 data-nosnippet>182</a>/// // ...
<a href=#183 id=183 data-nosnippet>183</a>/// };
<a href=#184 id=184 data-nosnippet>184</a>///
<a href=#185 id=185 data-nosnippet>185</a>/// static CALLSITE_ID: callsite::Identifier = identify_callsite!(&amp;CALLSITE);
<a href=#186 id=186 data-nosnippet>186</a>/// # }
<a href=#187 id=187 data-nosnippet>187</a>/// ```
<a href=#188 id=188 data-nosnippet>188</a>///
<a href=#189 id=189 data-nosnippet>189</a>/// [`Identifier`]: callsite::Identifier
<a href=#190 id=190 data-nosnippet>190</a>/// [`Callsite`]: callsite::Callsite
<a href=#191 id=191 data-nosnippet>191</a></span><span class="attr">#[macro_export]
<a href=#192 id=192 data-nosnippet>192</a></span><span class="macro">macro_rules!</span> identify_callsite {
<a href=#193 id=193 data-nosnippet>193</a> (<span class="macro-nonterminal">$callsite</span>:expr) =&gt; {
<a href=#194 id=194 data-nosnippet>194</a> <span class="macro-nonterminal">$crate::callsite::Identifier</span>(<span class="macro-nonterminal">$callsite</span>)
<a href=#195 id=195 data-nosnippet>195</a> };
<a href=#196 id=196 data-nosnippet>196</a>}
<a href=#197 id=197 data-nosnippet>197</a>
<a href=#198 id=198 data-nosnippet>198</a><span class="doccomment">/// Statically constructs new span [metadata].
<a href=#199 id=199 data-nosnippet>199</a>///
<a href=#200 id=200 data-nosnippet>200</a>/// /// For example:
<a href=#201 id=201 data-nosnippet>201</a>/// ```rust
<a href=#202 id=202 data-nosnippet>202</a>/// # use tracing_core::{callsite::Callsite, subscriber::Interest};
<a href=#203 id=203 data-nosnippet>203</a>/// use tracing_core::metadata;
<a href=#204 id=204 data-nosnippet>204</a>/// use tracing_core::metadata::{Kind, Level, Metadata};
<a href=#205 id=205 data-nosnippet>205</a>/// # fn main() {
<a href=#206 id=206 data-nosnippet>206</a>/// # pub struct MyCallsite { }
<a href=#207 id=207 data-nosnippet>207</a>/// # impl Callsite for MyCallsite {
<a href=#208 id=208 data-nosnippet>208</a>/// # fn set_interest(&amp;self, _: Interest) { unimplemented!() }
<a href=#209 id=209 data-nosnippet>209</a>/// # fn metadata(&amp;self) -&gt; &amp;Metadata { unimplemented!() }
<a href=#210 id=210 data-nosnippet>210</a>/// # }
<a href=#211 id=211 data-nosnippet>211</a>/// #
<a href=#212 id=212 data-nosnippet>212</a>/// static FOO_CALLSITE: MyCallsite = MyCallsite {
<a href=#213 id=213 data-nosnippet>213</a>/// // ...
<a href=#214 id=214 data-nosnippet>214</a>/// };
<a href=#215 id=215 data-nosnippet>215</a>///
<a href=#216 id=216 data-nosnippet>216</a>/// static FOO_METADATA: Metadata = metadata!{
<a href=#217 id=217 data-nosnippet>217</a>/// name: "foo",
<a href=#218 id=218 data-nosnippet>218</a>/// target: module_path!(),
<a href=#219 id=219 data-nosnippet>219</a>/// level: Level::DEBUG,
<a href=#220 id=220 data-nosnippet>220</a>/// fields: &amp;["bar", "baz"],
<a href=#221 id=221 data-nosnippet>221</a>/// callsite: &amp;FOO_CALLSITE,
<a href=#222 id=222 data-nosnippet>222</a>/// kind: Kind::SPAN,
<a href=#223 id=223 data-nosnippet>223</a>/// };
<a href=#224 id=224 data-nosnippet>224</a>/// # }
<a href=#225 id=225 data-nosnippet>225</a>/// ```
<a href=#226 id=226 data-nosnippet>226</a>///
<a href=#227 id=227 data-nosnippet>227</a>/// [metadata]: metadata::Metadata
<a href=#228 id=228 data-nosnippet>228</a>/// [`Metadata::new`]: metadata::Metadata::new
<a href=#229 id=229 data-nosnippet>229</a></span><span class="attr">#[macro_export]
<a href=#230 id=230 data-nosnippet>230</a></span><span class="macro">macro_rules!</span> metadata {
<a href=#231 id=231 data-nosnippet>231</a> (
<a href=#232 id=232 data-nosnippet>232</a> name: <span class="macro-nonterminal">$name</span>:expr,
<a href=#233 id=233 data-nosnippet>233</a> target: <span class="macro-nonterminal">$target</span>:expr,
<a href=#234 id=234 data-nosnippet>234</a> level: <span class="macro-nonterminal">$level</span>:expr,
<a href=#235 id=235 data-nosnippet>235</a> fields: <span class="macro-nonterminal">$fields</span>:expr,
<a href=#236 id=236 data-nosnippet>236</a> callsite: <span class="macro-nonterminal">$callsite</span>:expr,
<a href=#237 id=237 data-nosnippet>237</a> kind: <span class="macro-nonterminal">$kind</span>:expr
<a href=#238 id=238 data-nosnippet>238</a> ) =&gt; {
<a href=#239 id=239 data-nosnippet>239</a> <span class="macro-nonterminal">$crate::metadata</span>! {
<a href=#240 id=240 data-nosnippet>240</a> name: <span class="macro-nonterminal">$name</span>,
<a href=#241 id=241 data-nosnippet>241</a> target: <span class="macro-nonterminal">$target</span>,
<a href=#242 id=242 data-nosnippet>242</a> level: <span class="macro-nonterminal">$level</span>,
<a href=#243 id=243 data-nosnippet>243</a> fields: <span class="macro-nonterminal">$fields</span>,
<a href=#244 id=244 data-nosnippet>244</a> callsite: <span class="macro-nonterminal">$callsite</span>,
<a href=#245 id=245 data-nosnippet>245</a> kind: <span class="macro-nonterminal">$kind</span>,
<a href=#246 id=246 data-nosnippet>246</a> }
<a href=#247 id=247 data-nosnippet>247</a> };
<a href=#248 id=248 data-nosnippet>248</a> (
<a href=#249 id=249 data-nosnippet>249</a> name: <span class="macro-nonterminal">$name</span>:expr,
<a href=#250 id=250 data-nosnippet>250</a> target: <span class="macro-nonterminal">$target</span>:expr,
<a href=#251 id=251 data-nosnippet>251</a> level: <span class="macro-nonterminal">$level</span>:expr,
<a href=#252 id=252 data-nosnippet>252</a> fields: <span class="macro-nonterminal">$fields</span>:expr,
<a href=#253 id=253 data-nosnippet>253</a> callsite: <span class="macro-nonterminal">$callsite</span>:expr,
<a href=#254 id=254 data-nosnippet>254</a> kind: <span class="macro-nonterminal">$kind</span>:expr,
<a href=#255 id=255 data-nosnippet>255</a> ) =&gt; {
<a href=#256 id=256 data-nosnippet>256</a> <span class="macro-nonterminal">$crate::metadata::Metadata::new</span>(
<a href=#257 id=257 data-nosnippet>257</a> <span class="macro-nonterminal">$name</span>,
<a href=#258 id=258 data-nosnippet>258</a> <span class="macro-nonterminal">$target</span>,
<a href=#259 id=259 data-nosnippet>259</a> <span class="macro-nonterminal">$level</span>,
<a href=#260 id=260 data-nosnippet>260</a> <span class="macro-nonterminal">$crate::__macro_support::Option::Some</span>(<span class="macro-nonterminal">$crate::__macro_support::file</span>!()),
<a href=#261 id=261 data-nosnippet>261</a> <span class="macro-nonterminal">$crate::__macro_support::Option::Some</span>(<span class="macro-nonterminal">$crate::__macro_support::line</span>!()),
<a href=#262 id=262 data-nosnippet>262</a> <span class="macro-nonterminal">$crate::__macro_support::Option::Some</span>(<span class="macro-nonterminal">$crate::__macro_support::module_path</span>!()),
<a href=#263 id=263 data-nosnippet>263</a> <span class="macro-nonterminal">$crate::field::FieldSet::new</span>(<span class="macro-nonterminal">$fields</span>, <span class="macro-nonterminal">$crate::identify_callsite</span>!(<span class="macro-nonterminal">$callsite</span>)),
<a href=#264 id=264 data-nosnippet>264</a> <span class="macro-nonterminal">$kind</span>,
<a href=#265 id=265 data-nosnippet>265</a> )
<a href=#266 id=266 data-nosnippet>266</a> };
<a href=#267 id=267 data-nosnippet>267</a>}
<a href=#268 id=268 data-nosnippet>268</a>
<a href=#269 id=269 data-nosnippet>269</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod </span>lazy;
<a href=#270 id=270 data-nosnippet>270</a>
<a href=#271 id=271 data-nosnippet>271</a><span class="comment">// Trimmed-down vendored version of spin 0.5.2 (0387621)
<a href=#272 id=272 data-nosnippet>272</a>// Dependency of no_std lazy_static, not required in a std build
<a href=#273 id=273 data-nosnippet>273</a></span><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#274 id=274 data-nosnippet>274</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod </span>spin;
<a href=#275 id=275 data-nosnippet>275</a>
<a href=#276 id=276 data-nosnippet>276</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#277 id=277 data-nosnippet>277</a>#[doc(hidden)]
<a href=#278 id=278 data-nosnippet>278</a></span><span class="kw">pub type </span>Once = <span class="self">self</span>::spin::Once&lt;()&gt;;
<a href=#279 id=279 data-nosnippet>279</a>
<a href=#280 id=280 data-nosnippet>280</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#281 id=281 data-nosnippet>281</a></span><span class="kw">pub use </span>std::sync::Once;
<a href=#282 id=282 data-nosnippet>282</a>
<a href=#283 id=283 data-nosnippet>283</a><span class="kw">pub mod </span>callsite;
<a href=#284 id=284 data-nosnippet>284</a><span class="kw">pub mod </span>dispatcher;
<a href=#285 id=285 data-nosnippet>285</a><span class="kw">pub mod </span>event;
<a href=#286 id=286 data-nosnippet>286</a><span class="kw">pub mod </span>field;
<a href=#287 id=287 data-nosnippet>287</a><span class="kw">pub mod </span>metadata;
<a href=#288 id=288 data-nosnippet>288</a><span class="kw">mod </span>parent;
<a href=#289 id=289 data-nosnippet>289</a><span class="kw">pub mod </span>span;
<a href=#290 id=290 data-nosnippet>290</a><span class="kw">pub mod </span>subscriber;
<a href=#291 id=291 data-nosnippet>291</a><span class="attr">#[cfg(not(feature = <span class="string">"std"</span>))]
<a href=#292 id=292 data-nosnippet>292</a></span><span class="kw">mod </span>sync;
<a href=#293 id=293 data-nosnippet>293</a>
<a href=#294 id=294 data-nosnippet>294</a><span class="attr">#[cfg(feature = <span class="string">"std"</span>)]
<a href=#295 id=295 data-nosnippet>295</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">use </span>std::sync;
<a href=#296 id=296 data-nosnippet>296</a>
<a href=#297 id=297 data-nosnippet>297</a><span class="attr">#[doc(inline)]
<a href=#298 id=298 data-nosnippet>298</a></span><span class="kw">pub use </span><span class="self">self</span>::{
<a href=#299 id=299 data-nosnippet>299</a> callsite::Callsite,
<a href=#300 id=300 data-nosnippet>300</a> dispatcher::Dispatch,
<a href=#301 id=301 data-nosnippet>301</a> event::Event,
<a href=#302 id=302 data-nosnippet>302</a> field::Field,
<a href=#303 id=303 data-nosnippet>303</a> metadata::{Level, LevelFilter, Metadata},
<a href=#304 id=304 data-nosnippet>304</a> subscriber::Subscriber,
<a href=#305 id=305 data-nosnippet>305</a>};
<a href=#306 id=306 data-nosnippet>306</a>
<a href=#307 id=307 data-nosnippet>307</a><span class="kw">pub use </span><span class="self">self</span>::{metadata::Kind, subscriber::Interest};
<a href=#308 id=308 data-nosnippet>308</a>
<a href=#309 id=309 data-nosnippet>309</a><span class="kw">mod </span>sealed {
<a href=#310 id=310 data-nosnippet>310</a> <span class="kw">pub trait </span>Sealed {}
<a href=#311 id=311 data-nosnippet>311</a>}
</code></pre></div></section></main></body></html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
<!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/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-core-0.1.36/src/parent.rs`."><title>parent.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tracing_core" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="icon" href="https://raw.githubusercontent.com/tokio-rs/tracing/main/assets/favicon.ico"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">tracing_core/</div>parent.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-2"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="kw">use </span><span class="kw">crate</span>::span::Id;
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a><span class="attr">#[derive(Debug)]
<a href=#4 id=4 data-nosnippet>4</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">enum </span>Parent {
<a href=#5 id=5 data-nosnippet>5</a> <span class="doccomment">/// The new span will be a root span.
<a href=#6 id=6 data-nosnippet>6</a> </span>Root,
<a href=#7 id=7 data-nosnippet>7</a> <span class="doccomment">/// The new span will be rooted in the current span.
<a href=#8 id=8 data-nosnippet>8</a> </span>Current,
<a href=#9 id=9 data-nosnippet>9</a> <span class="doccomment">/// The new span has an explicitly-specified parent.
<a href=#10 id=10 data-nosnippet>10</a> </span>Explicit(Id),
<a href=#11 id=11 data-nosnippet>11</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,344 @@
<!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/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-core-0.1.36/src/span.rs`."><title>span.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tracing_core" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="icon" href="https://raw.githubusercontent.com/tokio-rs/tracing/main/assets/favicon.ico"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">tracing_core/</div>span.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Spans represent periods of time in the execution of a program.
<a href=#2 id=2 data-nosnippet>2</a>
<a href=#3 id=3 data-nosnippet>3</a></span><span class="kw">use </span>core::num::NonZeroU64;
<a href=#4 id=4 data-nosnippet>4</a>
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span><span class="kw">crate</span>::field::FieldSet;
<a href=#6 id=6 data-nosnippet>6</a><span class="kw">use </span><span class="kw">crate</span>::parent::Parent;
<a href=#7 id=7 data-nosnippet>7</a><span class="kw">use crate</span>::{field, Metadata};
<a href=#8 id=8 data-nosnippet>8</a>
<a href=#9 id=9 data-nosnippet>9</a><span class="doccomment">/// Identifies a span within the context of a subscriber.
<a href=#10 id=10 data-nosnippet>10</a>///
<a href=#11 id=11 data-nosnippet>11</a>/// They are generated by [`Subscriber`]s for each span as it is created, by
<a href=#12 id=12 data-nosnippet>12</a>/// the [`new_span`] trait method. See the documentation for that method for
<a href=#13 id=13 data-nosnippet>13</a>/// more information on span ID generation.
<a href=#14 id=14 data-nosnippet>14</a>///
<a href=#15 id=15 data-nosnippet>15</a>/// [`Subscriber`]: super::subscriber::Subscriber
<a href=#16 id=16 data-nosnippet>16</a>/// [`new_span`]: super::subscriber::Subscriber::new_span
<a href=#17 id=17 data-nosnippet>17</a></span><span class="attr">#[derive(Clone, Debug, PartialEq, Eq, Hash)]
<a href=#18 id=18 data-nosnippet>18</a></span><span class="kw">pub struct </span>Id(NonZeroU64);
<a href=#19 id=19 data-nosnippet>19</a>
<a href=#20 id=20 data-nosnippet>20</a><span class="doccomment">/// Attributes provided to a `Subscriber` describing a new span when it is
<a href=#21 id=21 data-nosnippet>21</a>/// created.
<a href=#22 id=22 data-nosnippet>22</a></span><span class="attr">#[derive(Debug)]
<a href=#23 id=23 data-nosnippet>23</a></span><span class="kw">pub struct </span>Attributes&lt;<span class="lifetime">'a</span>&gt; {
<a href=#24 id=24 data-nosnippet>24</a> metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;,
<a href=#25 id=25 data-nosnippet>25</a> values: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt;,
<a href=#26 id=26 data-nosnippet>26</a> parent: Parent,
<a href=#27 id=27 data-nosnippet>27</a>}
<a href=#28 id=28 data-nosnippet>28</a>
<a href=#29 id=29 data-nosnippet>29</a><span class="doccomment">/// A set of fields recorded by a span.
<a href=#30 id=30 data-nosnippet>30</a></span><span class="attr">#[derive(Debug)]
<a href=#31 id=31 data-nosnippet>31</a></span><span class="kw">pub struct </span>Record&lt;<span class="lifetime">'a</span>&gt; {
<a href=#32 id=32 data-nosnippet>32</a> values: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt;,
<a href=#33 id=33 data-nosnippet>33</a>}
<a href=#34 id=34 data-nosnippet>34</a>
<a href=#35 id=35 data-nosnippet>35</a><span class="doccomment">/// Indicates what [the `Subscriber` considers] the "current" span.
<a href=#36 id=36 data-nosnippet>36</a>///
<a href=#37 id=37 data-nosnippet>37</a>/// As subscribers may not track a notion of a current span, this has three
<a href=#38 id=38 data-nosnippet>38</a>/// possible states:
<a href=#39 id=39 data-nosnippet>39</a>/// - "unknown", indicating that the subscriber does not track a current span,
<a href=#40 id=40 data-nosnippet>40</a>/// - "none", indicating that the current context is known to not be in a span,
<a href=#41 id=41 data-nosnippet>41</a>/// - "some", with the current span's [`Id`] and [`Metadata`].
<a href=#42 id=42 data-nosnippet>42</a>///
<a href=#43 id=43 data-nosnippet>43</a>/// [the `Subscriber` considers]: super::subscriber::Subscriber::current_span
<a href=#44 id=44 data-nosnippet>44</a>/// [`Metadata`]: super::metadata::Metadata
<a href=#45 id=45 data-nosnippet>45</a></span><span class="attr">#[derive(Debug)]
<a href=#46 id=46 data-nosnippet>46</a></span><span class="kw">pub struct </span>Current {
<a href=#47 id=47 data-nosnippet>47</a> inner: CurrentInner,
<a href=#48 id=48 data-nosnippet>48</a>}
<a href=#49 id=49 data-nosnippet>49</a>
<a href=#50 id=50 data-nosnippet>50</a><span class="attr">#[derive(Debug)]
<a href=#51 id=51 data-nosnippet>51</a></span><span class="kw">enum </span>CurrentInner {
<a href=#52 id=52 data-nosnippet>52</a> Current {
<a href=#53 id=53 data-nosnippet>53</a> id: Id,
<a href=#54 id=54 data-nosnippet>54</a> metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;,
<a href=#55 id=55 data-nosnippet>55</a> },
<a href=#56 id=56 data-nosnippet>56</a> <span class="prelude-val">None</span>,
<a href=#57 id=57 data-nosnippet>57</a> Unknown,
<a href=#58 id=58 data-nosnippet>58</a>}
<a href=#59 id=59 data-nosnippet>59</a>
<a href=#60 id=60 data-nosnippet>60</a><span class="comment">// ===== impl Span =====
<a href=#61 id=61 data-nosnippet>61</a>
<a href=#62 id=62 data-nosnippet>62</a></span><span class="kw">impl </span>Id {
<a href=#63 id=63 data-nosnippet>63</a> <span class="doccomment">/// Constructs a new span ID from the given `u64`.
<a href=#64 id=64 data-nosnippet>64</a> ///
<a href=#65 id=65 data-nosnippet>65</a> /// &lt;pre class="ignore" style="white-space:normal;font:inherit;"&gt;
<a href=#66 id=66 data-nosnippet>66</a> /// &lt;strong&gt;Note&lt;/strong&gt;: Span IDs must be greater than zero.
<a href=#67 id=67 data-nosnippet>67</a> /// &lt;/pre&gt;
<a href=#68 id=68 data-nosnippet>68</a> ///
<a href=#69 id=69 data-nosnippet>69</a> /// # Panics
<a href=#70 id=70 data-nosnippet>70</a> /// - If the provided `u64` is 0.
<a href=#71 id=71 data-nosnippet>71</a> </span><span class="kw">pub fn </span>from_u64(u: u64) -&gt; <span class="self">Self </span>{
<a href=#72 id=72 data-nosnippet>72</a> Id(NonZeroU64::new(u).expect(<span class="string">"span IDs must be &gt; 0"</span>))
<a href=#73 id=73 data-nosnippet>73</a> }
<a href=#74 id=74 data-nosnippet>74</a>
<a href=#75 id=75 data-nosnippet>75</a> <span class="doccomment">/// Constructs a new span ID from the given `NonZeroU64`.
<a href=#76 id=76 data-nosnippet>76</a> ///
<a href=#77 id=77 data-nosnippet>77</a> /// Unlike [`Id::from_u64`](Id::from_u64()), this will never panic.
<a href=#78 id=78 data-nosnippet>78</a> </span><span class="attr">#[inline]
<a href=#79 id=79 data-nosnippet>79</a> </span><span class="kw">pub const fn </span>from_non_zero_u64(id: NonZeroU64) -&gt; <span class="self">Self </span>{
<a href=#80 id=80 data-nosnippet>80</a> Id(id)
<a href=#81 id=81 data-nosnippet>81</a> }
<a href=#82 id=82 data-nosnippet>82</a>
<a href=#83 id=83 data-nosnippet>83</a> <span class="comment">// Allow `into` by-ref since we don't want to impl Copy for Id
<a href=#84 id=84 data-nosnippet>84</a> </span><span class="attr">#[allow(clippy::wrong_self_convention)]
<a href=#85 id=85 data-nosnippet>85</a> </span><span class="doccomment">/// Returns the span's ID as a `u64`.
<a href=#86 id=86 data-nosnippet>86</a> </span><span class="kw">pub fn </span>into_u64(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; u64 {
<a href=#87 id=87 data-nosnippet>87</a> <span class="self">self</span>.<span class="number">0</span>.get()
<a href=#88 id=88 data-nosnippet>88</a> }
<a href=#89 id=89 data-nosnippet>89</a>
<a href=#90 id=90 data-nosnippet>90</a> <span class="comment">// Allow `into` by-ref since we don't want to impl Copy for Id
<a href=#91 id=91 data-nosnippet>91</a> </span><span class="attr">#[allow(clippy::wrong_self_convention)]
<a href=#92 id=92 data-nosnippet>92</a> </span><span class="doccomment">/// Returns the span's ID as a `NonZeroU64`.
<a href=#93 id=93 data-nosnippet>93</a> </span><span class="attr">#[inline]
<a href=#94 id=94 data-nosnippet>94</a> </span><span class="kw">pub const fn </span>into_non_zero_u64(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; NonZeroU64 {
<a href=#95 id=95 data-nosnippet>95</a> <span class="self">self</span>.<span class="number">0
<a href=#96 id=96 data-nosnippet>96</a> </span>}
<a href=#97 id=97 data-nosnippet>97</a>}
<a href=#98 id=98 data-nosnippet>98</a>
<a href=#99 id=99 data-nosnippet>99</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>Id&gt; <span class="kw">for </span><span class="prelude-ty">Option</span>&lt;Id&gt; {
<a href=#100 id=100 data-nosnippet>100</a> <span class="kw">fn </span>from(id: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>Id) -&gt; <span class="self">Self </span>{
<a href=#101 id=101 data-nosnippet>101</a> <span class="prelude-val">Some</span>(id.clone())
<a href=#102 id=102 data-nosnippet>102</a> }
<a href=#103 id=103 data-nosnippet>103</a>}
<a href=#104 id=104 data-nosnippet>104</a>
<a href=#105 id=105 data-nosnippet>105</a><span class="comment">// ===== impl Attributes =====
<a href=#106 id=106 data-nosnippet>106</a>
<a href=#107 id=107 data-nosnippet>107</a></span><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; Attributes&lt;<span class="lifetime">'a</span>&gt; {
<a href=#108 id=108 data-nosnippet>108</a> <span class="doccomment">/// Returns `Attributes` describing a new child span of the current span,
<a href=#109 id=109 data-nosnippet>109</a> /// with the provided metadata and values.
<a href=#110 id=110 data-nosnippet>110</a> </span><span class="kw">pub fn </span>new(metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;, values: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#111 id=111 data-nosnippet>111</a> Attributes {
<a href=#112 id=112 data-nosnippet>112</a> metadata,
<a href=#113 id=113 data-nosnippet>113</a> values,
<a href=#114 id=114 data-nosnippet>114</a> parent: Parent::Current,
<a href=#115 id=115 data-nosnippet>115</a> }
<a href=#116 id=116 data-nosnippet>116</a> }
<a href=#117 id=117 data-nosnippet>117</a>
<a href=#118 id=118 data-nosnippet>118</a> <span class="doccomment">/// Returns `Attributes` describing a new span at the root of its own trace
<a href=#119 id=119 data-nosnippet>119</a> /// tree, with the provided metadata and values.
<a href=#120 id=120 data-nosnippet>120</a> </span><span class="kw">pub fn </span>new_root(metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;, values: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#121 id=121 data-nosnippet>121</a> Attributes {
<a href=#122 id=122 data-nosnippet>122</a> metadata,
<a href=#123 id=123 data-nosnippet>123</a> values,
<a href=#124 id=124 data-nosnippet>124</a> parent: Parent::Root,
<a href=#125 id=125 data-nosnippet>125</a> }
<a href=#126 id=126 data-nosnippet>126</a> }
<a href=#127 id=127 data-nosnippet>127</a>
<a href=#128 id=128 data-nosnippet>128</a> <span class="doccomment">/// Returns `Attributes` describing a new child span of the specified
<a href=#129 id=129 data-nosnippet>129</a> /// parent span, with the provided metadata and values.
<a href=#130 id=130 data-nosnippet>130</a> </span><span class="kw">pub fn </span>child_of(
<a href=#131 id=131 data-nosnippet>131</a> parent: Id,
<a href=#132 id=132 data-nosnippet>132</a> metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;,
<a href=#133 id=133 data-nosnippet>133</a> values: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt;,
<a href=#134 id=134 data-nosnippet>134</a> ) -&gt; <span class="self">Self </span>{
<a href=#135 id=135 data-nosnippet>135</a> Attributes {
<a href=#136 id=136 data-nosnippet>136</a> metadata,
<a href=#137 id=137 data-nosnippet>137</a> values,
<a href=#138 id=138 data-nosnippet>138</a> parent: Parent::Explicit(parent),
<a href=#139 id=139 data-nosnippet>139</a> }
<a href=#140 id=140 data-nosnippet>140</a> }
<a href=#141 id=141 data-nosnippet>141</a>
<a href=#142 id=142 data-nosnippet>142</a> <span class="doccomment">/// Returns a reference to the new span's metadata.
<a href=#143 id=143 data-nosnippet>143</a> </span><span class="kw">pub fn </span>metadata(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt; {
<a href=#144 id=144 data-nosnippet>144</a> <span class="self">self</span>.metadata
<a href=#145 id=145 data-nosnippet>145</a> }
<a href=#146 id=146 data-nosnippet>146</a>
<a href=#147 id=147 data-nosnippet>147</a> <span class="doccomment">/// Returns a reference to a `ValueSet` containing any values the new span
<a href=#148 id=148 data-nosnippet>148</a> /// was created with.
<a href=#149 id=149 data-nosnippet>149</a> </span><span class="kw">pub fn </span>values(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt; {
<a href=#150 id=150 data-nosnippet>150</a> <span class="self">self</span>.values
<a href=#151 id=151 data-nosnippet>151</a> }
<a href=#152 id=152 data-nosnippet>152</a>
<a href=#153 id=153 data-nosnippet>153</a> <span class="doccomment">/// Returns true if the new span should be a root.
<a href=#154 id=154 data-nosnippet>154</a> </span><span class="kw">pub fn </span>is_root(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#155 id=155 data-nosnippet>155</a> <span class="macro">matches!</span>(<span class="self">self</span>.parent, Parent::Root)
<a href=#156 id=156 data-nosnippet>156</a> }
<a href=#157 id=157 data-nosnippet>157</a>
<a href=#158 id=158 data-nosnippet>158</a> <span class="doccomment">/// Returns true if the new span's parent should be determined based on the
<a href=#159 id=159 data-nosnippet>159</a> /// current context.
<a href=#160 id=160 data-nosnippet>160</a> ///
<a href=#161 id=161 data-nosnippet>161</a> /// If this is true and the current thread is currently inside a span, then
<a href=#162 id=162 data-nosnippet>162</a> /// that span should be the new span's parent. Otherwise, if the current
<a href=#163 id=163 data-nosnippet>163</a> /// thread is _not_ inside a span, then the new span will be the root of its
<a href=#164 id=164 data-nosnippet>164</a> /// own trace tree.
<a href=#165 id=165 data-nosnippet>165</a> </span><span class="kw">pub fn </span>is_contextual(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#166 id=166 data-nosnippet>166</a> <span class="macro">matches!</span>(<span class="self">self</span>.parent, Parent::Current)
<a href=#167 id=167 data-nosnippet>167</a> }
<a href=#168 id=168 data-nosnippet>168</a>
<a href=#169 id=169 data-nosnippet>169</a> <span class="doccomment">/// Returns the new span's explicitly-specified parent, if there is one.
<a href=#170 id=170 data-nosnippet>170</a> ///
<a href=#171 id=171 data-nosnippet>171</a> /// Otherwise (if the new span is a root or is a child of the current span),
<a href=#172 id=172 data-nosnippet>172</a> /// returns `None`.
<a href=#173 id=173 data-nosnippet>173</a> </span><span class="kw">pub fn </span>parent(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>Id&gt; {
<a href=#174 id=174 data-nosnippet>174</a> <span class="kw">match </span><span class="self">self</span>.parent {
<a href=#175 id=175 data-nosnippet>175</a> Parent::Explicit(<span class="kw-2">ref </span>p) =&gt; <span class="prelude-val">Some</span>(p),
<a href=#176 id=176 data-nosnippet>176</a> <span class="kw">_ </span>=&gt; <span class="prelude-val">None</span>,
<a href=#177 id=177 data-nosnippet>177</a> }
<a href=#178 id=178 data-nosnippet>178</a> }
<a href=#179 id=179 data-nosnippet>179</a>
<a href=#180 id=180 data-nosnippet>180</a> <span class="doccomment">/// Records all the fields in this set of `Attributes` with the provided
<a href=#181 id=181 data-nosnippet>181</a> /// [Visitor].
<a href=#182 id=182 data-nosnippet>182</a> ///
<a href=#183 id=183 data-nosnippet>183</a> /// [visitor]: super::field::Visit
<a href=#184 id=184 data-nosnippet>184</a> </span><span class="kw">pub fn </span>record(<span class="kw-2">&amp;</span><span class="self">self</span>, visitor: <span class="kw-2">&amp;mut </span><span class="kw">dyn </span>field::Visit) {
<a href=#185 id=185 data-nosnippet>185</a> <span class="self">self</span>.values.record(visitor)
<a href=#186 id=186 data-nosnippet>186</a> }
<a href=#187 id=187 data-nosnippet>187</a>
<a href=#188 id=188 data-nosnippet>188</a> <span class="doccomment">/// Returns `true` if this set of `Attributes` contains a value for the
<a href=#189 id=189 data-nosnippet>189</a> /// given `Field`.
<a href=#190 id=190 data-nosnippet>190</a> </span><span class="kw">pub fn </span>contains(<span class="kw-2">&amp;</span><span class="self">self</span>, field: <span class="kw-2">&amp;</span>field::Field) -&gt; bool {
<a href=#191 id=191 data-nosnippet>191</a> <span class="self">self</span>.values.contains(field)
<a href=#192 id=192 data-nosnippet>192</a> }
<a href=#193 id=193 data-nosnippet>193</a>
<a href=#194 id=194 data-nosnippet>194</a> <span class="doccomment">/// Returns true if this set of `Attributes` contains _no_ values.
<a href=#195 id=195 data-nosnippet>195</a> </span><span class="kw">pub fn </span>is_empty(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#196 id=196 data-nosnippet>196</a> <span class="self">self</span>.values.is_empty()
<a href=#197 id=197 data-nosnippet>197</a> }
<a href=#198 id=198 data-nosnippet>198</a>
<a href=#199 id=199 data-nosnippet>199</a> <span class="doccomment">/// Returns the set of all [fields] defined by this span's [`Metadata`].
<a href=#200 id=200 data-nosnippet>200</a> ///
<a href=#201 id=201 data-nosnippet>201</a> /// Note that the [`FieldSet`] returned by this method includes *all* the
<a href=#202 id=202 data-nosnippet>202</a> /// fields declared by this span, not just those with values that are recorded
<a href=#203 id=203 data-nosnippet>203</a> /// as part of this set of `Attributes`. Other fields with values not present in
<a href=#204 id=204 data-nosnippet>204</a> /// this `Attributes`' value set may [record] values later.
<a href=#205 id=205 data-nosnippet>205</a> ///
<a href=#206 id=206 data-nosnippet>206</a> /// [fields]: crate::field
<a href=#207 id=207 data-nosnippet>207</a> /// [record]: Attributes::record()
<a href=#208 id=208 data-nosnippet>208</a> /// [`Metadata`]: crate::metadata::Metadata
<a href=#209 id=209 data-nosnippet>209</a> /// [`FieldSet`]: crate::field::FieldSet
<a href=#210 id=210 data-nosnippet>210</a> </span><span class="kw">pub fn </span>fields(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>FieldSet {
<a href=#211 id=211 data-nosnippet>211</a> <span class="self">self</span>.values.field_set()
<a href=#212 id=212 data-nosnippet>212</a> }
<a href=#213 id=213 data-nosnippet>213</a>}
<a href=#214 id=214 data-nosnippet>214</a>
<a href=#215 id=215 data-nosnippet>215</a><span class="comment">// ===== impl Record =====
<a href=#216 id=216 data-nosnippet>216</a>
<a href=#217 id=217 data-nosnippet>217</a></span><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; Record&lt;<span class="lifetime">'a</span>&gt; {
<a href=#218 id=218 data-nosnippet>218</a> <span class="doccomment">/// Constructs a new `Record` from a `ValueSet`.
<a href=#219 id=219 data-nosnippet>219</a> </span><span class="kw">pub fn </span>new(values: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>field::ValueSet&lt;<span class="lifetime">'a</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#220 id=220 data-nosnippet>220</a> <span class="self">Self </span>{ values }
<a href=#221 id=221 data-nosnippet>221</a> }
<a href=#222 id=222 data-nosnippet>222</a>
<a href=#223 id=223 data-nosnippet>223</a> <span class="doccomment">/// Records all the fields in this `Record` with the provided [Visitor].
<a href=#224 id=224 data-nosnippet>224</a> ///
<a href=#225 id=225 data-nosnippet>225</a> /// [visitor]: super::field::Visit
<a href=#226 id=226 data-nosnippet>226</a> </span><span class="kw">pub fn </span>record(<span class="kw-2">&amp;</span><span class="self">self</span>, visitor: <span class="kw-2">&amp;mut </span><span class="kw">dyn </span>field::Visit) {
<a href=#227 id=227 data-nosnippet>227</a> <span class="self">self</span>.values.record(visitor)
<a href=#228 id=228 data-nosnippet>228</a> }
<a href=#229 id=229 data-nosnippet>229</a>
<a href=#230 id=230 data-nosnippet>230</a> <span class="doccomment">/// Returns the number of fields that would be visited from this `Record`
<a href=#231 id=231 data-nosnippet>231</a> /// when [`Record::record()`] is called
<a href=#232 id=232 data-nosnippet>232</a> ///
<a href=#233 id=233 data-nosnippet>233</a> /// [`Record::record()`]: Record::record()
<a href=#234 id=234 data-nosnippet>234</a> </span><span class="kw">pub fn </span>len(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; usize {
<a href=#235 id=235 data-nosnippet>235</a> <span class="self">self</span>.values.len()
<a href=#236 id=236 data-nosnippet>236</a> }
<a href=#237 id=237 data-nosnippet>237</a>
<a href=#238 id=238 data-nosnippet>238</a> <span class="doccomment">/// Returns `true` if this `Record` contains a value for the given `Field`.
<a href=#239 id=239 data-nosnippet>239</a> </span><span class="kw">pub fn </span>contains(<span class="kw-2">&amp;</span><span class="self">self</span>, field: <span class="kw-2">&amp;</span>field::Field) -&gt; bool {
<a href=#240 id=240 data-nosnippet>240</a> <span class="self">self</span>.values.contains(field)
<a href=#241 id=241 data-nosnippet>241</a> }
<a href=#242 id=242 data-nosnippet>242</a>
<a href=#243 id=243 data-nosnippet>243</a> <span class="doccomment">/// Returns true if this `Record` contains _no_ values.
<a href=#244 id=244 data-nosnippet>244</a> </span><span class="kw">pub fn </span>is_empty(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#245 id=245 data-nosnippet>245</a> <span class="self">self</span>.values.is_empty()
<a href=#246 id=246 data-nosnippet>246</a> }
<a href=#247 id=247 data-nosnippet>247</a>}
<a href=#248 id=248 data-nosnippet>248</a>
<a href=#249 id=249 data-nosnippet>249</a><span class="comment">// ===== impl Current =====
<a href=#250 id=250 data-nosnippet>250</a>
<a href=#251 id=251 data-nosnippet>251</a></span><span class="kw">impl </span>Current {
<a href=#252 id=252 data-nosnippet>252</a> <span class="doccomment">/// Constructs a new `Current` that indicates the current context is a span
<a href=#253 id=253 data-nosnippet>253</a> /// with the given `metadata` and `metadata`.
<a href=#254 id=254 data-nosnippet>254</a> </span><span class="kw">pub fn </span>new(id: Id, metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;) -&gt; <span class="self">Self </span>{
<a href=#255 id=255 data-nosnippet>255</a> <span class="self">Self </span>{
<a href=#256 id=256 data-nosnippet>256</a> inner: CurrentInner::Current { id, metadata },
<a href=#257 id=257 data-nosnippet>257</a> }
<a href=#258 id=258 data-nosnippet>258</a> }
<a href=#259 id=259 data-nosnippet>259</a>
<a href=#260 id=260 data-nosnippet>260</a> <span class="doccomment">/// Constructs a new `Current` that indicates the current context is *not*
<a href=#261 id=261 data-nosnippet>261</a> /// in a span.
<a href=#262 id=262 data-nosnippet>262</a> </span><span class="kw">pub fn </span>none() -&gt; <span class="self">Self </span>{
<a href=#263 id=263 data-nosnippet>263</a> <span class="self">Self </span>{
<a href=#264 id=264 data-nosnippet>264</a> inner: CurrentInner::None,
<a href=#265 id=265 data-nosnippet>265</a> }
<a href=#266 id=266 data-nosnippet>266</a> }
<a href=#267 id=267 data-nosnippet>267</a>
<a href=#268 id=268 data-nosnippet>268</a> <span class="doccomment">/// Constructs a new `Current` that indicates the `Subscriber` does not
<a href=#269 id=269 data-nosnippet>269</a> /// track a current span.
<a href=#270 id=270 data-nosnippet>270</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>unknown() -&gt; <span class="self">Self </span>{
<a href=#271 id=271 data-nosnippet>271</a> <span class="self">Self </span>{
<a href=#272 id=272 data-nosnippet>272</a> inner: CurrentInner::Unknown,
<a href=#273 id=273 data-nosnippet>273</a> }
<a href=#274 id=274 data-nosnippet>274</a> }
<a href=#275 id=275 data-nosnippet>275</a>
<a href=#276 id=276 data-nosnippet>276</a> <span class="doccomment">/// Returns `true` if the `Subscriber` that constructed this `Current` tracks a
<a href=#277 id=277 data-nosnippet>277</a> /// current span.
<a href=#278 id=278 data-nosnippet>278</a> ///
<a href=#279 id=279 data-nosnippet>279</a> /// If this returns `true` and [`id`], [`metadata`], or [`into_inner`]
<a href=#280 id=280 data-nosnippet>280</a> /// return `None`, that indicates that we are currently known to *not* be
<a href=#281 id=281 data-nosnippet>281</a> /// inside a span. If this returns `false`, those methods will also return
<a href=#282 id=282 data-nosnippet>282</a> /// `None`, but in this case, that is because the subscriber does not keep
<a href=#283 id=283 data-nosnippet>283</a> /// track of the currently-entered span.
<a href=#284 id=284 data-nosnippet>284</a> ///
<a href=#285 id=285 data-nosnippet>285</a> /// [`id`]: Current::id()
<a href=#286 id=286 data-nosnippet>286</a> /// [`metadata`]: Current::metadata()
<a href=#287 id=287 data-nosnippet>287</a> /// [`into_inner`]: Current::into_inner()
<a href=#288 id=288 data-nosnippet>288</a> </span><span class="kw">pub fn </span>is_known(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#289 id=289 data-nosnippet>289</a> !<span class="macro">matches!</span>(<span class="self">self</span>.inner, CurrentInner::Unknown)
<a href=#290 id=290 data-nosnippet>290</a> }
<a href=#291 id=291 data-nosnippet>291</a>
<a href=#292 id=292 data-nosnippet>292</a> <span class="doccomment">/// Consumes `self` and returns the span `Id` and `Metadata` of the current
<a href=#293 id=293 data-nosnippet>293</a> /// span, if one exists and is known.
<a href=#294 id=294 data-nosnippet>294</a> </span><span class="kw">pub fn </span>into_inner(<span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;(Id, <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;)&gt; {
<a href=#295 id=295 data-nosnippet>295</a> <span class="kw">match </span><span class="self">self</span>.inner {
<a href=#296 id=296 data-nosnippet>296</a> CurrentInner::Current { id, metadata } =&gt; <span class="prelude-val">Some</span>((id, metadata)),
<a href=#297 id=297 data-nosnippet>297</a> <span class="kw">_ </span>=&gt; <span class="prelude-val">None</span>,
<a href=#298 id=298 data-nosnippet>298</a> }
<a href=#299 id=299 data-nosnippet>299</a> }
<a href=#300 id=300 data-nosnippet>300</a>
<a href=#301 id=301 data-nosnippet>301</a> <span class="doccomment">/// Borrows the `Id` of the current span, if one exists and is known.
<a href=#302 id=302 data-nosnippet>302</a> </span><span class="kw">pub fn </span>id(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>Id&gt; {
<a href=#303 id=303 data-nosnippet>303</a> <span class="kw">match </span><span class="self">self</span>.inner {
<a href=#304 id=304 data-nosnippet>304</a> CurrentInner::Current { <span class="kw-2">ref </span>id, .. } =&gt; <span class="prelude-val">Some</span>(id),
<a href=#305 id=305 data-nosnippet>305</a> <span class="kw">_ </span>=&gt; <span class="prelude-val">None</span>,
<a href=#306 id=306 data-nosnippet>306</a> }
<a href=#307 id=307 data-nosnippet>307</a> }
<a href=#308 id=308 data-nosnippet>308</a>
<a href=#309 id=309 data-nosnippet>309</a> <span class="doccomment">/// Borrows the `Metadata` of the current span, if one exists and is known.
<a href=#310 id=310 data-nosnippet>310</a> </span><span class="kw">pub fn </span>metadata(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;&gt; {
<a href=#311 id=311 data-nosnippet>311</a> <span class="kw">match </span><span class="self">self</span>.inner {
<a href=#312 id=312 data-nosnippet>312</a> CurrentInner::Current { metadata, .. } =&gt; <span class="prelude-val">Some</span>(metadata),
<a href=#313 id=313 data-nosnippet>313</a> <span class="kw">_ </span>=&gt; <span class="prelude-val">None</span>,
<a href=#314 id=314 data-nosnippet>314</a> }
<a href=#315 id=315 data-nosnippet>315</a> }
<a href=#316 id=316 data-nosnippet>316</a>}
<a href=#317 id=317 data-nosnippet>317</a>
<a href=#318 id=318 data-nosnippet>318</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>Current&gt; <span class="kw">for </span><span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>Id&gt; {
<a href=#319 id=319 data-nosnippet>319</a> <span class="kw">fn </span>from(cur: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>Current) -&gt; <span class="self">Self </span>{
<a href=#320 id=320 data-nosnippet>320</a> cur.id()
<a href=#321 id=321 data-nosnippet>321</a> }
<a href=#322 id=322 data-nosnippet>322</a>}
<a href=#323 id=323 data-nosnippet>323</a>
<a href=#324 id=324 data-nosnippet>324</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>Current&gt; <span class="kw">for </span><span class="prelude-ty">Option</span>&lt;Id&gt; {
<a href=#325 id=325 data-nosnippet>325</a> <span class="kw">fn </span>from(cur: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>Current) -&gt; <span class="self">Self </span>{
<a href=#326 id=326 data-nosnippet>326</a> cur.id().cloned()
<a href=#327 id=327 data-nosnippet>327</a> }
<a href=#328 id=328 data-nosnippet>328</a>}
<a href=#329 id=329 data-nosnippet>329</a>
<a href=#330 id=330 data-nosnippet>330</a><span class="kw">impl </span>From&lt;Current&gt; <span class="kw">for </span><span class="prelude-ty">Option</span>&lt;Id&gt; {
<a href=#331 id=331 data-nosnippet>331</a> <span class="kw">fn </span>from(cur: Current) -&gt; <span class="self">Self </span>{
<a href=#332 id=332 data-nosnippet>332</a> <span class="kw">match </span>cur.inner {
<a href=#333 id=333 data-nosnippet>333</a> CurrentInner::Current { id, .. } =&gt; <span class="prelude-val">Some</span>(id),
<a href=#334 id=334 data-nosnippet>334</a> <span class="kw">_ </span>=&gt; <span class="prelude-val">None</span>,
<a href=#335 id=335 data-nosnippet>335</a> }
<a href=#336 id=336 data-nosnippet>336</a> }
<a href=#337 id=337 data-nosnippet>337</a>}
<a href=#338 id=338 data-nosnippet>338</a>
<a href=#339 id=339 data-nosnippet>339</a><span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>Current&gt; <span class="kw">for </span><span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;&gt; {
<a href=#340 id=340 data-nosnippet>340</a> <span class="kw">fn </span>from(cur: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>Current) -&gt; <span class="self">Self </span>{
<a href=#341 id=341 data-nosnippet>341</a> cur.metadata()
<a href=#342 id=342 data-nosnippet>342</a> }
<a href=#343 id=343 data-nosnippet>343</a>}
</code></pre></div></section></main></body></html>

View File

@@ -0,0 +1,876 @@
<!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/newkirk/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tracing-core-0.1.36/src/subscriber.rs`."><title>subscriber.rs - source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tracing_core" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../../static.files/src-script-813739b1.js"></script><script defer src="../../src-files.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="icon" href="https://raw.githubusercontent.com/tokio-rs/tracing/main/assets/favicon.ico"></head><body class="rustdoc src"><!--[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="src-sidebar-title"><h2>Files</h2></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><section id="main-content" class="content"><div class="main-heading"><h1><div class="sub-heading">tracing_core/</div>subscriber.rs</h1><rustdoc-toolbar></rustdoc-toolbar></div><div class="example-wrap digits-3"><pre class="rust"><code><a href=#1 id=1 data-nosnippet>1</a><span class="doccomment">//! Collectors collect and record trace data.
<a href=#2 id=2 data-nosnippet>2</a></span><span class="kw">use crate</span>::{span, Dispatch, Event, LevelFilter, Metadata};
<a href=#3 id=3 data-nosnippet>3</a>
<a href=#4 id=4 data-nosnippet>4</a><span class="kw">use </span>alloc::{boxed::Box, sync::Arc};
<a href=#5 id=5 data-nosnippet>5</a><span class="kw">use </span>core::any::{Any, TypeId};
<a href=#6 id=6 data-nosnippet>6</a>
<a href=#7 id=7 data-nosnippet>7</a><span class="doccomment">/// Trait representing the functions required to collect trace data.
<a href=#8 id=8 data-nosnippet>8</a>///
<a href=#9 id=9 data-nosnippet>9</a>/// Crates that provide implementations of methods for collecting or recording
<a href=#10 id=10 data-nosnippet>10</a>/// trace data should implement the `Subscriber` interface. This trait is
<a href=#11 id=11 data-nosnippet>11</a>/// intended to represent fundamental primitives for collecting trace events and
<a href=#12 id=12 data-nosnippet>12</a>/// spans — other libraries may offer utility functions and types to make
<a href=#13 id=13 data-nosnippet>13</a>/// subscriber implementations more modular or improve the ergonomics of writing
<a href=#14 id=14 data-nosnippet>14</a>/// subscribers.
<a href=#15 id=15 data-nosnippet>15</a>///
<a href=#16 id=16 data-nosnippet>16</a>/// A subscriber is responsible for the following:
<a href=#17 id=17 data-nosnippet>17</a>/// - Registering new spans as they are created, and providing them with span
<a href=#18 id=18 data-nosnippet>18</a>/// IDs. Implicitly, this means the subscriber may determine the strategy for
<a href=#19 id=19 data-nosnippet>19</a>/// determining span equality.
<a href=#20 id=20 data-nosnippet>20</a>/// - Recording the attachment of field values and follows-from annotations to
<a href=#21 id=21 data-nosnippet>21</a>/// spans.
<a href=#22 id=22 data-nosnippet>22</a>/// - Filtering spans and events, and determining when those filters must be
<a href=#23 id=23 data-nosnippet>23</a>/// invalidated.
<a href=#24 id=24 data-nosnippet>24</a>/// - Observing spans as they are entered, exited, and closed, and events as
<a href=#25 id=25 data-nosnippet>25</a>/// they occur.
<a href=#26 id=26 data-nosnippet>26</a>///
<a href=#27 id=27 data-nosnippet>27</a>/// When a span is entered or exited, the subscriber is provided only with the
<a href=#28 id=28 data-nosnippet>28</a>/// [ID] with which it tagged that span when it was created. This means
<a href=#29 id=29 data-nosnippet>29</a>/// that it is up to the subscriber to determine whether and how span _data_ —
<a href=#30 id=30 data-nosnippet>30</a>/// the fields and metadata describing the span — should be stored. The
<a href=#31 id=31 data-nosnippet>31</a>/// [`new_span`] function is called when a new span is created, and at that
<a href=#32 id=32 data-nosnippet>32</a>/// point, the subscriber _may_ choose to store the associated data if it will
<a href=#33 id=33 data-nosnippet>33</a>/// be referenced again. However, if the data has already been recorded and will
<a href=#34 id=34 data-nosnippet>34</a>/// not be needed by the implementations of `enter` and `exit`, the subscriber
<a href=#35 id=35 data-nosnippet>35</a>/// may freely discard that data without allocating space to store it.
<a href=#36 id=36 data-nosnippet>36</a>///
<a href=#37 id=37 data-nosnippet>37</a>/// ## Overriding default impls
<a href=#38 id=38 data-nosnippet>38</a>///
<a href=#39 id=39 data-nosnippet>39</a>/// Some trait methods on `Subscriber` have default implementations, either in
<a href=#40 id=40 data-nosnippet>40</a>/// order to reduce the surface area of implementing `Subscriber`, or for
<a href=#41 id=41 data-nosnippet>41</a>/// backward-compatibility reasons. However, many subscribers will likely want
<a href=#42 id=42 data-nosnippet>42</a>/// to override these default implementations.
<a href=#43 id=43 data-nosnippet>43</a>///
<a href=#44 id=44 data-nosnippet>44</a>/// The following methods are likely of interest:
<a href=#45 id=45 data-nosnippet>45</a>///
<a href=#46 id=46 data-nosnippet>46</a>/// - [`register_callsite`] is called once for each callsite from which a span
<a href=#47 id=47 data-nosnippet>47</a>/// event may originate, and returns an [`Interest`] value describing whether or
<a href=#48 id=48 data-nosnippet>48</a>/// not the subscriber wishes to see events or spans from that callsite. By
<a href=#49 id=49 data-nosnippet>49</a>/// default, it calls [`enabled`], and returns `Interest::always()` if
<a href=#50 id=50 data-nosnippet>50</a>/// `enabled` returns true, or `Interest::never()` if enabled returns false.
<a href=#51 id=51 data-nosnippet>51</a>/// However, if the subscriber's interest can change dynamically at runtime,
<a href=#52 id=52 data-nosnippet>52</a>/// it may want to override this function to return `Interest::sometimes()`.
<a href=#53 id=53 data-nosnippet>53</a>/// Additionally, subscribers which wish to perform a behaviour once for each
<a href=#54 id=54 data-nosnippet>54</a>/// callsite, such as allocating storage for data related to that callsite,
<a href=#55 id=55 data-nosnippet>55</a>/// can perform it in `register_callsite`.
<a href=#56 id=56 data-nosnippet>56</a>///
<a href=#57 id=57 data-nosnippet>57</a>/// See also the [documentation on the callsite registry][cs-reg] for details
<a href=#58 id=58 data-nosnippet>58</a>/// on [`register_callsite`].
<a href=#59 id=59 data-nosnippet>59</a>///
<a href=#60 id=60 data-nosnippet>60</a>/// - [`event_enabled`] is called once before every call to the [`event`]
<a href=#61 id=61 data-nosnippet>61</a>/// method. This can be used to implement filtering on events once their field
<a href=#62 id=62 data-nosnippet>62</a>/// values are known, but before any processing is done in the `event` method.
<a href=#63 id=63 data-nosnippet>63</a>/// - [`clone_span`] is called every time a span ID is cloned, and [`try_close`]
<a href=#64 id=64 data-nosnippet>64</a>/// is called when a span ID is dropped. By default, these functions do
<a href=#65 id=65 data-nosnippet>65</a>/// nothing. However, they can be used to implement reference counting for
<a href=#66 id=66 data-nosnippet>66</a>/// spans, allowing subscribers to free storage for span data and to determine
<a href=#67 id=67 data-nosnippet>67</a>/// when a span has _closed_ permanently (rather than being exited).
<a href=#68 id=68 data-nosnippet>68</a>/// Subscribers which store per-span data or which need to track span closures
<a href=#69 id=69 data-nosnippet>69</a>/// should override these functions together.
<a href=#70 id=70 data-nosnippet>70</a>///
<a href=#71 id=71 data-nosnippet>71</a>/// [ID]: super::span::Id
<a href=#72 id=72 data-nosnippet>72</a>/// [`new_span`]: Subscriber::new_span
<a href=#73 id=73 data-nosnippet>73</a>/// [`register_callsite`]: Subscriber::register_callsite
<a href=#74 id=74 data-nosnippet>74</a>/// [`enabled`]: Subscriber::enabled
<a href=#75 id=75 data-nosnippet>75</a>/// [`clone_span`]: Subscriber::clone_span
<a href=#76 id=76 data-nosnippet>76</a>/// [`try_close`]: Subscriber::try_close
<a href=#77 id=77 data-nosnippet>77</a>/// [cs-reg]: crate::callsite#registering-callsites
<a href=#78 id=78 data-nosnippet>78</a>/// [`event`]: Subscriber::event
<a href=#79 id=79 data-nosnippet>79</a>/// [`event_enabled`]: Subscriber::event_enabled
<a href=#80 id=80 data-nosnippet>80</a></span><span class="kw">pub trait </span>Subscriber: <span class="lifetime">'static </span>{
<a href=#81 id=81 data-nosnippet>81</a> <span class="doccomment">/// Invoked when this subscriber becomes a [`Dispatch`].
<a href=#82 id=82 data-nosnippet>82</a> ///
<a href=#83 id=83 data-nosnippet>83</a> /// ## Avoiding Memory Leaks
<a href=#84 id=84 data-nosnippet>84</a> ///
<a href=#85 id=85 data-nosnippet>85</a> /// `Subscriber`s should not store their own [`Dispatch`]. Because the
<a href=#86 id=86 data-nosnippet>86</a> /// `Dispatch` owns the `Subscriber`, storing the `Dispatch` within the
<a href=#87 id=87 data-nosnippet>87</a> /// `Subscriber` will create a reference count cycle, preventing the `Dispatch`
<a href=#88 id=88 data-nosnippet>88</a> /// from ever being dropped.
<a href=#89 id=89 data-nosnippet>89</a> ///
<a href=#90 id=90 data-nosnippet>90</a> /// Instead, when it is necessary to store a cyclical reference to the
<a href=#91 id=91 data-nosnippet>91</a> /// `Dispatch` within a `Subscriber`, use [`Dispatch::downgrade`] to convert a
<a href=#92 id=92 data-nosnippet>92</a> /// `Dispatch` into a [`WeakDispatch`]. This type is analogous to
<a href=#93 id=93 data-nosnippet>93</a> /// [`std::sync::Weak`], and does not create a reference count cycle. A
<a href=#94 id=94 data-nosnippet>94</a> /// [`WeakDispatch`] can be stored within a `Subscriber` without causing a
<a href=#95 id=95 data-nosnippet>95</a> /// memory leak, and can be [upgraded] into a `Dispatch` temporarily when
<a href=#96 id=96 data-nosnippet>96</a> /// the `Dispatch` must be accessed by the `Subscriber`.
<a href=#97 id=97 data-nosnippet>97</a> ///
<a href=#98 id=98 data-nosnippet>98</a> /// [`WeakDispatch`]: crate::dispatcher::WeakDispatch
<a href=#99 id=99 data-nosnippet>99</a> /// [upgraded]: crate::dispatcher::WeakDispatch::upgrade
<a href=#100 id=100 data-nosnippet>100</a> </span><span class="kw">fn </span>on_register_dispatch(<span class="kw-2">&amp;</span><span class="self">self</span>, subscriber: <span class="kw-2">&amp;</span>Dispatch) {
<a href=#101 id=101 data-nosnippet>101</a> <span class="kw">let _ </span>= subscriber;
<a href=#102 id=102 data-nosnippet>102</a> }
<a href=#103 id=103 data-nosnippet>103</a>
<a href=#104 id=104 data-nosnippet>104</a> <span class="doccomment">/// Registers a new [callsite] with this subscriber, returning whether or not
<a href=#105 id=105 data-nosnippet>105</a> /// the subscriber is interested in being notified about the callsite.
<a href=#106 id=106 data-nosnippet>106</a> ///
<a href=#107 id=107 data-nosnippet>107</a> /// By default, this function assumes that the subscriber's [filter]
<a href=#108 id=108 data-nosnippet>108</a> /// represents an unchanging view of its interest in the callsite. However,
<a href=#109 id=109 data-nosnippet>109</a> /// if this is not the case, subscribers may override this function to
<a href=#110 id=110 data-nosnippet>110</a> /// indicate different interests, or to implement behaviour that should run
<a href=#111 id=111 data-nosnippet>111</a> /// once for every callsite.
<a href=#112 id=112 data-nosnippet>112</a> ///
<a href=#113 id=113 data-nosnippet>113</a> /// This function is guaranteed to be called at least once per callsite on
<a href=#114 id=114 data-nosnippet>114</a> /// every active subscriber. The subscriber may store the keys to fields it
<a href=#115 id=115 data-nosnippet>115</a> /// cares about in order to reduce the cost of accessing fields by name,
<a href=#116 id=116 data-nosnippet>116</a> /// preallocate storage for that callsite, or perform any other actions it
<a href=#117 id=117 data-nosnippet>117</a> /// wishes to perform once for each callsite.
<a href=#118 id=118 data-nosnippet>118</a> ///
<a href=#119 id=119 data-nosnippet>119</a> /// The subscriber should then return an [`Interest`], indicating
<a href=#120 id=120 data-nosnippet>120</a> /// whether it is interested in being notified about that callsite in the
<a href=#121 id=121 data-nosnippet>121</a> /// future. This may be `Always` indicating that the subscriber always
<a href=#122 id=122 data-nosnippet>122</a> /// wishes to be notified about the callsite, and its filter need not be
<a href=#123 id=123 data-nosnippet>123</a> /// re-evaluated; `Sometimes`, indicating that the subscriber may sometimes
<a href=#124 id=124 data-nosnippet>124</a> /// care about the callsite but not always (such as when sampling), or
<a href=#125 id=125 data-nosnippet>125</a> /// `Never`, indicating that the subscriber never wishes to be notified about
<a href=#126 id=126 data-nosnippet>126</a> /// that callsite. If all active subscribers return `Never`, a callsite will
<a href=#127 id=127 data-nosnippet>127</a> /// never be enabled unless a new subscriber expresses interest in it.
<a href=#128 id=128 data-nosnippet>128</a> ///
<a href=#129 id=129 data-nosnippet>129</a> /// `Subscriber`s which require their filters to be run every time an event
<a href=#130 id=130 data-nosnippet>130</a> /// occurs or a span is entered/exited should return `Interest::sometimes`.
<a href=#131 id=131 data-nosnippet>131</a> /// If a subscriber returns `Interest::sometimes`, then its [`enabled`] method
<a href=#132 id=132 data-nosnippet>132</a> /// will be called every time an event or span is created from that callsite.
<a href=#133 id=133 data-nosnippet>133</a> ///
<a href=#134 id=134 data-nosnippet>134</a> /// For example, suppose a sampling subscriber is implemented by
<a href=#135 id=135 data-nosnippet>135</a> /// incrementing a counter every time `enabled` is called and only returning
<a href=#136 id=136 data-nosnippet>136</a> /// `true` when the counter is divisible by a specified sampling rate. If
<a href=#137 id=137 data-nosnippet>137</a> /// that subscriber returns `Interest::always` from `register_callsite`, then
<a href=#138 id=138 data-nosnippet>138</a> /// the filter will not be re-evaluated once it has been applied to a given
<a href=#139 id=139 data-nosnippet>139</a> /// set of metadata. Thus, the counter will not be incremented, and the span
<a href=#140 id=140 data-nosnippet>140</a> /// or event that corresponds to the metadata will never be `enabled`.
<a href=#141 id=141 data-nosnippet>141</a> ///
<a href=#142 id=142 data-nosnippet>142</a> /// `Subscriber`s that need to change their filters occasionally should call
<a href=#143 id=143 data-nosnippet>143</a> /// [`rebuild_interest_cache`] to re-evaluate `register_callsite` for all
<a href=#144 id=144 data-nosnippet>144</a> /// callsites.
<a href=#145 id=145 data-nosnippet>145</a> ///
<a href=#146 id=146 data-nosnippet>146</a> /// Similarly, if a `Subscriber` has a filtering strategy that can be
<a href=#147 id=147 data-nosnippet>147</a> /// changed dynamically at runtime, it would need to re-evaluate that filter
<a href=#148 id=148 data-nosnippet>148</a> /// if the cached results have changed.
<a href=#149 id=149 data-nosnippet>149</a> ///
<a href=#150 id=150 data-nosnippet>150</a> /// A subscriber which manages fanout to multiple other subscribers
<a href=#151 id=151 data-nosnippet>151</a> /// should proxy this decision to all of its child subscribers,
<a href=#152 id=152 data-nosnippet>152</a> /// returning `Interest::never` only if _all_ such children return
<a href=#153 id=153 data-nosnippet>153</a> /// `Interest::never`. If the set of subscribers to which spans are
<a href=#154 id=154 data-nosnippet>154</a> /// broadcast may change dynamically, the subscriber should also never
<a href=#155 id=155 data-nosnippet>155</a> /// return `Interest::Never`, as a new subscriber may be added that _is_
<a href=#156 id=156 data-nosnippet>156</a> /// interested.
<a href=#157 id=157 data-nosnippet>157</a> ///
<a href=#158 id=158 data-nosnippet>158</a> /// See the [documentation on the callsite registry][cs-reg] for more
<a href=#159 id=159 data-nosnippet>159</a> /// details on how and when the `register_callsite` method is called.
<a href=#160 id=160 data-nosnippet>160</a> ///
<a href=#161 id=161 data-nosnippet>161</a> /// # Notes
<a href=#162 id=162 data-nosnippet>162</a> /// This function may be called again when a new subscriber is created or
<a href=#163 id=163 data-nosnippet>163</a> /// when the registry is invalidated.
<a href=#164 id=164 data-nosnippet>164</a> ///
<a href=#165 id=165 data-nosnippet>165</a> /// If a subscriber returns `Interest::never` for a particular callsite, it
<a href=#166 id=166 data-nosnippet>166</a> /// _may_ still see spans and events originating from that callsite, if
<a href=#167 id=167 data-nosnippet>167</a> /// another subscriber expressed interest in it.
<a href=#168 id=168 data-nosnippet>168</a> ///
<a href=#169 id=169 data-nosnippet>169</a> /// [callsite]: crate::callsite
<a href=#170 id=170 data-nosnippet>170</a> /// [filter]: Self::enabled
<a href=#171 id=171 data-nosnippet>171</a> /// [metadata]: super::metadata::Metadata
<a href=#172 id=172 data-nosnippet>172</a> /// [`enabled`]: Subscriber::enabled()
<a href=#173 id=173 data-nosnippet>173</a> /// [`rebuild_interest_cache`]: super::callsite::rebuild_interest_cache
<a href=#174 id=174 data-nosnippet>174</a> /// [cs-reg]: crate::callsite#registering-callsites
<a href=#175 id=175 data-nosnippet>175</a> </span><span class="kw">fn </span>register_callsite(<span class="kw-2">&amp;</span><span class="self">self</span>, metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;) -&gt; Interest {
<a href=#176 id=176 data-nosnippet>176</a> <span class="kw">if </span><span class="self">self</span>.enabled(metadata) {
<a href=#177 id=177 data-nosnippet>177</a> Interest::always()
<a href=#178 id=178 data-nosnippet>178</a> } <span class="kw">else </span>{
<a href=#179 id=179 data-nosnippet>179</a> Interest::never()
<a href=#180 id=180 data-nosnippet>180</a> }
<a href=#181 id=181 data-nosnippet>181</a> }
<a href=#182 id=182 data-nosnippet>182</a>
<a href=#183 id=183 data-nosnippet>183</a> <span class="doccomment">/// Returns true if a span or event with the specified [metadata] would be
<a href=#184 id=184 data-nosnippet>184</a> /// recorded.
<a href=#185 id=185 data-nosnippet>185</a> ///
<a href=#186 id=186 data-nosnippet>186</a> /// By default, it is assumed that this filter needs only be evaluated once
<a href=#187 id=187 data-nosnippet>187</a> /// for each callsite, so it is called by [`register_callsite`] when each
<a href=#188 id=188 data-nosnippet>188</a> /// callsite is registered. The result is used to determine if the subscriber
<a href=#189 id=189 data-nosnippet>189</a> /// is always [interested] or never interested in that callsite. This is intended
<a href=#190 id=190 data-nosnippet>190</a> /// primarily as an optimization, so that expensive filters (such as those
<a href=#191 id=191 data-nosnippet>191</a> /// involving string search, et cetera) need not be re-evaluated.
<a href=#192 id=192 data-nosnippet>192</a> ///
<a href=#193 id=193 data-nosnippet>193</a> /// However, if the subscriber's interest in a particular span or event may
<a href=#194 id=194 data-nosnippet>194</a> /// change, or depends on contexts only determined dynamically at runtime,
<a href=#195 id=195 data-nosnippet>195</a> /// then the `register_callsite` method should be overridden to return
<a href=#196 id=196 data-nosnippet>196</a> /// [`Interest::sometimes`]. In that case, this function will be called every
<a href=#197 id=197 data-nosnippet>197</a> /// time that span or event occurs.
<a href=#198 id=198 data-nosnippet>198</a> ///
<a href=#199 id=199 data-nosnippet>199</a> /// [metadata]: super::metadata::Metadata
<a href=#200 id=200 data-nosnippet>200</a> /// [interested]: Interest
<a href=#201 id=201 data-nosnippet>201</a> /// [`Interest::sometimes`]: Interest::sometimes
<a href=#202 id=202 data-nosnippet>202</a> /// [`register_callsite`]: Subscriber::register_callsite()
<a href=#203 id=203 data-nosnippet>203</a> </span><span class="kw">fn </span>enabled(<span class="kw-2">&amp;</span><span class="self">self</span>, metadata: <span class="kw-2">&amp;</span>Metadata&lt;<span class="lifetime">'_</span>&gt;) -&gt; bool;
<a href=#204 id=204 data-nosnippet>204</a>
<a href=#205 id=205 data-nosnippet>205</a> <span class="doccomment">/// Returns the highest [verbosity level][level] that this `Subscriber` will
<a href=#206 id=206 data-nosnippet>206</a> /// enable, or `None`, if the subscriber does not implement level-based
<a href=#207 id=207 data-nosnippet>207</a> /// filtering or chooses not to implement this method.
<a href=#208 id=208 data-nosnippet>208</a> ///
<a href=#209 id=209 data-nosnippet>209</a> /// If this method returns a [`Level`][level], it will be used as a hint to
<a href=#210 id=210 data-nosnippet>210</a> /// determine the most verbose level that will be enabled. This will allow
<a href=#211 id=211 data-nosnippet>211</a> /// spans and events which are more verbose than that level to be skipped
<a href=#212 id=212 data-nosnippet>212</a> /// more efficiently. Subscribers which perform filtering are strongly
<a href=#213 id=213 data-nosnippet>213</a> /// encouraged to provide an implementation of this method.
<a href=#214 id=214 data-nosnippet>214</a> ///
<a href=#215 id=215 data-nosnippet>215</a> /// If the maximum level the subscriber will enable can change over the
<a href=#216 id=216 data-nosnippet>216</a> /// course of its lifetime, it is free to return a different value from
<a href=#217 id=217 data-nosnippet>217</a> /// multiple invocations of this method. However, note that changes in the
<a href=#218 id=218 data-nosnippet>218</a> /// maximum level will **only** be reflected after the callsite [`Interest`]
<a href=#219 id=219 data-nosnippet>219</a> /// cache is rebuilt, by calling the [`callsite::rebuild_interest_cache`][rebuild]
<a href=#220 id=220 data-nosnippet>220</a> /// function. Therefore, if the subscriber will change the value returned by
<a href=#221 id=221 data-nosnippet>221</a> /// this method, it is responsible for ensuring that
<a href=#222 id=222 data-nosnippet>222</a> /// [`rebuild_interest_cache`][rebuild] is called after the value of the max
<a href=#223 id=223 data-nosnippet>223</a> /// level changes.
<a href=#224 id=224 data-nosnippet>224</a> ///
<a href=#225 id=225 data-nosnippet>225</a> /// [level]: super::Level
<a href=#226 id=226 data-nosnippet>226</a> /// [rebuild]: super::callsite::rebuild_interest_cache
<a href=#227 id=227 data-nosnippet>227</a> </span><span class="kw">fn </span>max_level_hint(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;LevelFilter&gt; {
<a href=#228 id=228 data-nosnippet>228</a> <span class="prelude-val">None
<a href=#229 id=229 data-nosnippet>229</a> </span>}
<a href=#230 id=230 data-nosnippet>230</a>
<a href=#231 id=231 data-nosnippet>231</a> <span class="doccomment">/// Visit the construction of a new span, returning a new [span ID] for the
<a href=#232 id=232 data-nosnippet>232</a> /// span being constructed.
<a href=#233 id=233 data-nosnippet>233</a> ///
<a href=#234 id=234 data-nosnippet>234</a> /// The provided [`Attributes`] contains any field values that were provided
<a href=#235 id=235 data-nosnippet>235</a> /// when the span was created. The subscriber may pass a [visitor] to the
<a href=#236 id=236 data-nosnippet>236</a> /// `Attributes`' [`record` method] to record these values.
<a href=#237 id=237 data-nosnippet>237</a> ///
<a href=#238 id=238 data-nosnippet>238</a> /// IDs are used to uniquely identify spans and events within the context of a
<a href=#239 id=239 data-nosnippet>239</a> /// subscriber, so span equality will be based on the returned ID. Thus, if
<a href=#240 id=240 data-nosnippet>240</a> /// the subscriber wishes for all spans with the same metadata to be
<a href=#241 id=241 data-nosnippet>241</a> /// considered equal, it should return the same ID every time it is given a
<a href=#242 id=242 data-nosnippet>242</a> /// particular set of metadata. Similarly, if it wishes for two separate
<a href=#243 id=243 data-nosnippet>243</a> /// instances of a span with the same metadata to *not* be equal, it should
<a href=#244 id=244 data-nosnippet>244</a> /// return a distinct ID every time this function is called, regardless of
<a href=#245 id=245 data-nosnippet>245</a> /// the metadata.
<a href=#246 id=246 data-nosnippet>246</a> ///
<a href=#247 id=247 data-nosnippet>247</a> /// Note that the subscriber is free to assign span IDs based on whatever
<a href=#248 id=248 data-nosnippet>248</a> /// scheme it sees fit. Any guarantees about uniqueness, ordering, or ID
<a href=#249 id=249 data-nosnippet>249</a> /// reuse are left up to the subscriber implementation to determine.
<a href=#250 id=250 data-nosnippet>250</a> ///
<a href=#251 id=251 data-nosnippet>251</a> /// [span ID]: super::span::Id
<a href=#252 id=252 data-nosnippet>252</a> /// [`Attributes`]: super::span::Attributes
<a href=#253 id=253 data-nosnippet>253</a> /// [visitor]: super::field::Visit
<a href=#254 id=254 data-nosnippet>254</a> /// [`record` method]: super::span::Attributes::record
<a href=#255 id=255 data-nosnippet>255</a> </span><span class="kw">fn </span>new_span(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Attributes&lt;<span class="lifetime">'_</span>&gt;) -&gt; span::Id;
<a href=#256 id=256 data-nosnippet>256</a>
<a href=#257 id=257 data-nosnippet>257</a> <span class="comment">// === Notification methods ===============================================
<a href=#258 id=258 data-nosnippet>258</a>
<a href=#259 id=259 data-nosnippet>259</a> </span><span class="doccomment">/// Record a set of values on a span.
<a href=#260 id=260 data-nosnippet>260</a> ///
<a href=#261 id=261 data-nosnippet>261</a> /// This method will be invoked when value is recorded on a span.
<a href=#262 id=262 data-nosnippet>262</a> /// Recording multiple values for the same field is possible,
<a href=#263 id=263 data-nosnippet>263</a> /// but the actual behaviour is defined by the subscriber implementation.
<a href=#264 id=264 data-nosnippet>264</a> ///
<a href=#265 id=265 data-nosnippet>265</a> /// Keep in mind that a span might not provide a value
<a href=#266 id=266 data-nosnippet>266</a> /// for each field it declares.
<a href=#267 id=267 data-nosnippet>267</a> ///
<a href=#268 id=268 data-nosnippet>268</a> /// The subscriber is expected to provide a [visitor] to the `Record`'s
<a href=#269 id=269 data-nosnippet>269</a> /// [`record` method] in order to record the added values.
<a href=#270 id=270 data-nosnippet>270</a> ///
<a href=#271 id=271 data-nosnippet>271</a> /// # Example
<a href=#272 id=272 data-nosnippet>272</a> /// "foo = 3" will be recorded when [`record`] is called on the
<a href=#273 id=273 data-nosnippet>273</a> /// `Attributes` passed to `new_span`.
<a href=#274 id=274 data-nosnippet>274</a> /// Since values are not provided for the `bar` and `baz` fields,
<a href=#275 id=275 data-nosnippet>275</a> /// the span's `Metadata` will indicate that it _has_ those fields,
<a href=#276 id=276 data-nosnippet>276</a> /// but values for them won't be recorded at this time.
<a href=#277 id=277 data-nosnippet>277</a> ///
<a href=#278 id=278 data-nosnippet>278</a> /// ```rust,ignore
<a href=#279 id=279 data-nosnippet>279</a> /// # use tracing::span;
<a href=#280 id=280 data-nosnippet>280</a> ///
<a href=#281 id=281 data-nosnippet>281</a> /// let mut span = span!("my_span", foo = 3, bar, baz);
<a href=#282 id=282 data-nosnippet>282</a> ///
<a href=#283 id=283 data-nosnippet>283</a> /// // `Subscriber::record` will be called with a `Record`
<a href=#284 id=284 data-nosnippet>284</a> /// // containing "bar = false"
<a href=#285 id=285 data-nosnippet>285</a> /// span.record("bar", &amp;false);
<a href=#286 id=286 data-nosnippet>286</a> ///
<a href=#287 id=287 data-nosnippet>287</a> /// // `Subscriber::record` will be called with a `Record`
<a href=#288 id=288 data-nosnippet>288</a> /// // containing "baz = "a string""
<a href=#289 id=289 data-nosnippet>289</a> /// span.record("baz", &amp;"a string");
<a href=#290 id=290 data-nosnippet>290</a> /// ```
<a href=#291 id=291 data-nosnippet>291</a> ///
<a href=#292 id=292 data-nosnippet>292</a> /// [visitor]: super::field::Visit
<a href=#293 id=293 data-nosnippet>293</a> /// [`record`]: super::span::Attributes::record
<a href=#294 id=294 data-nosnippet>294</a> /// [`record` method]: super::span::Record::record
<a href=#295 id=295 data-nosnippet>295</a> </span><span class="kw">fn </span>record(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id, values: <span class="kw-2">&amp;</span>span::Record&lt;<span class="lifetime">'_</span>&gt;);
<a href=#296 id=296 data-nosnippet>296</a>
<a href=#297 id=297 data-nosnippet>297</a> <span class="doccomment">/// Adds an indication that `span` follows from the span with the id
<a href=#298 id=298 data-nosnippet>298</a> /// `follows`.
<a href=#299 id=299 data-nosnippet>299</a> ///
<a href=#300 id=300 data-nosnippet>300</a> /// This relationship differs somewhat from the parent-child relationship: a
<a href=#301 id=301 data-nosnippet>301</a> /// span may have any number of prior spans, rather than a single one; and
<a href=#302 id=302 data-nosnippet>302</a> /// spans are not considered to be executing _inside_ of the spans they
<a href=#303 id=303 data-nosnippet>303</a> /// follow from. This means that a span may close even if subsequent spans
<a href=#304 id=304 data-nosnippet>304</a> /// that follow from it are still open, and time spent inside of a
<a href=#305 id=305 data-nosnippet>305</a> /// subsequent span should not be included in the time its precedents were
<a href=#306 id=306 data-nosnippet>306</a> /// executing. This is used to model causal relationships such as when a
<a href=#307 id=307 data-nosnippet>307</a> /// single future spawns several related background tasks, et cetera.
<a href=#308 id=308 data-nosnippet>308</a> ///
<a href=#309 id=309 data-nosnippet>309</a> /// If the subscriber has spans corresponding to the given IDs, it should
<a href=#310 id=310 data-nosnippet>310</a> /// record this relationship in whatever way it deems necessary. Otherwise,
<a href=#311 id=311 data-nosnippet>311</a> /// if one or both of the given span IDs do not correspond to spans that the
<a href=#312 id=312 data-nosnippet>312</a> /// subscriber knows about, or if a cyclical relationship would be created
<a href=#313 id=313 data-nosnippet>313</a> /// (i.e., some span _a_ which proceeds some other span _b_ may not also
<a href=#314 id=314 data-nosnippet>314</a> /// follow from _b_), it may silently do nothing.
<a href=#315 id=315 data-nosnippet>315</a> </span><span class="kw">fn </span>record_follows_from(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id, follows: <span class="kw-2">&amp;</span>span::Id);
<a href=#316 id=316 data-nosnippet>316</a>
<a href=#317 id=317 data-nosnippet>317</a> <span class="doccomment">/// Determine if an [`Event`] should be recorded.
<a href=#318 id=318 data-nosnippet>318</a> ///
<a href=#319 id=319 data-nosnippet>319</a> /// By default, this returns `true` and `Subscriber`s can filter events in
<a href=#320 id=320 data-nosnippet>320</a> /// [`event`][Self::event] without any penalty. However, when `event` is
<a href=#321 id=321 data-nosnippet>321</a> /// more complicated, this can be used to determine if `event` should be
<a href=#322 id=322 data-nosnippet>322</a> /// called at all, separating out the decision from the processing.
<a href=#323 id=323 data-nosnippet>323</a> </span><span class="kw">fn </span>event_enabled(<span class="kw-2">&amp;</span><span class="self">self</span>, event: <span class="kw-2">&amp;</span>Event&lt;<span class="lifetime">'_</span>&gt;) -&gt; bool {
<a href=#324 id=324 data-nosnippet>324</a> <span class="kw">let _ </span>= event;
<a href=#325 id=325 data-nosnippet>325</a> <span class="bool-val">true
<a href=#326 id=326 data-nosnippet>326</a> </span>}
<a href=#327 id=327 data-nosnippet>327</a>
<a href=#328 id=328 data-nosnippet>328</a> <span class="doccomment">/// Records that an [`Event`] has occurred.
<a href=#329 id=329 data-nosnippet>329</a> ///
<a href=#330 id=330 data-nosnippet>330</a> /// This method will be invoked when an Event is constructed by
<a href=#331 id=331 data-nosnippet>331</a> /// the `Event`'s [`dispatch` method]. For example, this happens internally
<a href=#332 id=332 data-nosnippet>332</a> /// when an event macro from `tracing` is called.
<a href=#333 id=333 data-nosnippet>333</a> ///
<a href=#334 id=334 data-nosnippet>334</a> /// The key difference between this method and `record` is that `record` is
<a href=#335 id=335 data-nosnippet>335</a> /// called when a value is recorded for a field defined by a span,
<a href=#336 id=336 data-nosnippet>336</a> /// while `event` is called when a new event occurs.
<a href=#337 id=337 data-nosnippet>337</a> ///
<a href=#338 id=338 data-nosnippet>338</a> /// The provided `Event` struct contains any field values attached to the
<a href=#339 id=339 data-nosnippet>339</a> /// event. The subscriber may pass a [visitor] to the `Event`'s
<a href=#340 id=340 data-nosnippet>340</a> /// [`record` method] to record these values.
<a href=#341 id=341 data-nosnippet>341</a> ///
<a href=#342 id=342 data-nosnippet>342</a> /// [`Event`]: super::event::Event
<a href=#343 id=343 data-nosnippet>343</a> /// [visitor]: super::field::Visit
<a href=#344 id=344 data-nosnippet>344</a> /// [`record` method]: super::event::Event::record
<a href=#345 id=345 data-nosnippet>345</a> /// [`dispatch` method]: super::event::Event::dispatch
<a href=#346 id=346 data-nosnippet>346</a> </span><span class="kw">fn </span>event(<span class="kw-2">&amp;</span><span class="self">self</span>, event: <span class="kw-2">&amp;</span>Event&lt;<span class="lifetime">'_</span>&gt;);
<a href=#347 id=347 data-nosnippet>347</a>
<a href=#348 id=348 data-nosnippet>348</a> <span class="doccomment">/// Records that a span has been entered.
<a href=#349 id=349 data-nosnippet>349</a> ///
<a href=#350 id=350 data-nosnippet>350</a> /// When entering a span, this method is called to notify the subscriber
<a href=#351 id=351 data-nosnippet>351</a> /// that the span has been entered. The subscriber is provided with the
<a href=#352 id=352 data-nosnippet>352</a> /// [span ID] of the entered span, and should update any internal state
<a href=#353 id=353 data-nosnippet>353</a> /// tracking the current span accordingly.
<a href=#354 id=354 data-nosnippet>354</a> ///
<a href=#355 id=355 data-nosnippet>355</a> /// [span ID]: super::span::Id
<a href=#356 id=356 data-nosnippet>356</a> </span><span class="kw">fn </span>enter(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id);
<a href=#357 id=357 data-nosnippet>357</a>
<a href=#358 id=358 data-nosnippet>358</a> <span class="doccomment">/// Records that a span has been exited.
<a href=#359 id=359 data-nosnippet>359</a> ///
<a href=#360 id=360 data-nosnippet>360</a> /// When exiting a span, this method is called to notify the subscriber
<a href=#361 id=361 data-nosnippet>361</a> /// that the span has been exited. The subscriber is provided with the
<a href=#362 id=362 data-nosnippet>362</a> /// [span ID] of the exited span, and should update any internal state
<a href=#363 id=363 data-nosnippet>363</a> /// tracking the current span accordingly.
<a href=#364 id=364 data-nosnippet>364</a> ///
<a href=#365 id=365 data-nosnippet>365</a> /// Exiting a span does not imply that the span will not be re-entered.
<a href=#366 id=366 data-nosnippet>366</a> ///
<a href=#367 id=367 data-nosnippet>367</a> /// [span ID]: super::span::Id
<a href=#368 id=368 data-nosnippet>368</a> </span><span class="kw">fn </span>exit(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id);
<a href=#369 id=369 data-nosnippet>369</a>
<a href=#370 id=370 data-nosnippet>370</a> <span class="doccomment">/// Notifies the subscriber that a [span ID] has been cloned.
<a href=#371 id=371 data-nosnippet>371</a> ///
<a href=#372 id=372 data-nosnippet>372</a> /// This function is guaranteed to only be called with span IDs that were
<a href=#373 id=373 data-nosnippet>373</a> /// returned by this subscriber's `new_span` function.
<a href=#374 id=374 data-nosnippet>374</a> ///
<a href=#375 id=375 data-nosnippet>375</a> /// Note that the default implementation of this function this is just the
<a href=#376 id=376 data-nosnippet>376</a> /// identity function, passing through the identifier. However, it can be
<a href=#377 id=377 data-nosnippet>377</a> /// used in conjunction with [`try_close`] to track the number of handles
<a href=#378 id=378 data-nosnippet>378</a> /// capable of `enter`ing a span. When all the handles have been dropped
<a href=#379 id=379 data-nosnippet>379</a> /// (i.e., `try_close` has been called one more time than `clone_span` for a
<a href=#380 id=380 data-nosnippet>380</a> /// given ID), the subscriber may assume that the span will not be entered
<a href=#381 id=381 data-nosnippet>381</a> /// again. It is then free to deallocate storage for data associated with
<a href=#382 id=382 data-nosnippet>382</a> /// that span, write data from that span to IO, and so on.
<a href=#383 id=383 data-nosnippet>383</a> ///
<a href=#384 id=384 data-nosnippet>384</a> /// For more unsafe situations, however, if `id` is itself a pointer of some
<a href=#385 id=385 data-nosnippet>385</a> /// kind this can be used as a hook to "clone" the pointer, depending on
<a href=#386 id=386 data-nosnippet>386</a> /// what that means for the specified pointer.
<a href=#387 id=387 data-nosnippet>387</a> ///
<a href=#388 id=388 data-nosnippet>388</a> /// [span ID]: super::span::Id
<a href=#389 id=389 data-nosnippet>389</a> /// [`try_close`]: Subscriber::try_close
<a href=#390 id=390 data-nosnippet>390</a> </span><span class="kw">fn </span>clone_span(<span class="kw-2">&amp;</span><span class="self">self</span>, id: <span class="kw-2">&amp;</span>span::Id) -&gt; span::Id {
<a href=#391 id=391 data-nosnippet>391</a> id.clone()
<a href=#392 id=392 data-nosnippet>392</a> }
<a href=#393 id=393 data-nosnippet>393</a>
<a href=#394 id=394 data-nosnippet>394</a> <span class="doccomment">/// **This method is deprecated.**
<a href=#395 id=395 data-nosnippet>395</a> ///
<a href=#396 id=396 data-nosnippet>396</a> /// Using `drop_span` may result in subscribers composed using
<a href=#397 id=397 data-nosnippet>397</a> /// `tracing-subscriber` crate's `Layer` trait from observing close events.
<a href=#398 id=398 data-nosnippet>398</a> /// Use [`try_close`] instead.
<a href=#399 id=399 data-nosnippet>399</a> ///
<a href=#400 id=400 data-nosnippet>400</a> /// The default implementation of this function does nothing.
<a href=#401 id=401 data-nosnippet>401</a> ///
<a href=#402 id=402 data-nosnippet>402</a> /// [`try_close`]: Subscriber::try_close
<a href=#403 id=403 data-nosnippet>403</a> </span><span class="attr">#[deprecated(since = <span class="string">"0.1.2"</span>, note = <span class="string">"use `Subscriber::try_close` instead"</span>)]
<a href=#404 id=404 data-nosnippet>404</a> </span><span class="kw">fn </span>drop_span(<span class="kw-2">&amp;</span><span class="self">self</span>, _id: span::Id) {}
<a href=#405 id=405 data-nosnippet>405</a>
<a href=#406 id=406 data-nosnippet>406</a> <span class="doccomment">/// Notifies the subscriber that a [span ID] has been dropped, and returns
<a href=#407 id=407 data-nosnippet>407</a> /// `true` if there are now 0 IDs that refer to that span.
<a href=#408 id=408 data-nosnippet>408</a> ///
<a href=#409 id=409 data-nosnippet>409</a> /// Higher-level libraries providing functionality for composing multiple
<a href=#410 id=410 data-nosnippet>410</a> /// subscriber implementations may use this return value to notify any
<a href=#411 id=411 data-nosnippet>411</a> /// "layered" subscribers that this subscriber considers the span closed.
<a href=#412 id=412 data-nosnippet>412</a> ///
<a href=#413 id=413 data-nosnippet>413</a> /// The default implementation of this method calls the subscriber's
<a href=#414 id=414 data-nosnippet>414</a> /// [`drop_span`] method and returns `false`. This means that, unless the
<a href=#415 id=415 data-nosnippet>415</a> /// subscriber overrides the default implementation, close notifications
<a href=#416 id=416 data-nosnippet>416</a> /// will never be sent to any layered subscribers. In general, if the
<a href=#417 id=417 data-nosnippet>417</a> /// subscriber tracks reference counts, this method should be implemented,
<a href=#418 id=418 data-nosnippet>418</a> /// rather than `drop_span`.
<a href=#419 id=419 data-nosnippet>419</a> ///
<a href=#420 id=420 data-nosnippet>420</a> /// This function is guaranteed to only be called with span IDs that were
<a href=#421 id=421 data-nosnippet>421</a> /// returned by this subscriber's `new_span` function.
<a href=#422 id=422 data-nosnippet>422</a> ///
<a href=#423 id=423 data-nosnippet>423</a> /// It's guaranteed that if this function has been called once more than the
<a href=#424 id=424 data-nosnippet>424</a> /// number of times `clone_span` was called with the same `id`, then no more
<a href=#425 id=425 data-nosnippet>425</a> /// handles that can enter the span with that `id` exist. This means that it
<a href=#426 id=426 data-nosnippet>426</a> /// can be used in conjunction with [`clone_span`] to track the number of
<a href=#427 id=427 data-nosnippet>427</a> /// handles capable of `enter`ing a span. When all the handles have been
<a href=#428 id=428 data-nosnippet>428</a> /// dropped (i.e., `try_close` has been called one more time than
<a href=#429 id=429 data-nosnippet>429</a> /// `clone_span` for a given ID), the subscriber may assume that the span
<a href=#430 id=430 data-nosnippet>430</a> /// will not be entered again, and should return `true`. It is then free to
<a href=#431 id=431 data-nosnippet>431</a> /// deallocate storage for data associated with that span, write data from
<a href=#432 id=432 data-nosnippet>432</a> /// that span to IO, and so on.
<a href=#433 id=433 data-nosnippet>433</a> ///
<a href=#434 id=434 data-nosnippet>434</a> /// **Note**: since this function is called when spans are dropped,
<a href=#435 id=435 data-nosnippet>435</a> /// implementations should ensure that they are unwind-safe. Panicking from
<a href=#436 id=436 data-nosnippet>436</a> /// inside of a `try_close` function may cause a double panic, if the span
<a href=#437 id=437 data-nosnippet>437</a> /// was dropped due to a thread unwinding.
<a href=#438 id=438 data-nosnippet>438</a> ///
<a href=#439 id=439 data-nosnippet>439</a> /// [span ID]: super::span::Id
<a href=#440 id=440 data-nosnippet>440</a> /// [`clone_span`]: Subscriber::clone_span
<a href=#441 id=441 data-nosnippet>441</a> /// [`drop_span`]: Subscriber::drop_span
<a href=#442 id=442 data-nosnippet>442</a> </span><span class="kw">fn </span>try_close(<span class="kw-2">&amp;</span><span class="self">self</span>, id: span::Id) -&gt; bool {
<a href=#443 id=443 data-nosnippet>443</a> <span class="attr">#[allow(deprecated)]
<a href=#444 id=444 data-nosnippet>444</a> </span><span class="self">self</span>.drop_span(id);
<a href=#445 id=445 data-nosnippet>445</a> <span class="bool-val">false
<a href=#446 id=446 data-nosnippet>446</a> </span>}
<a href=#447 id=447 data-nosnippet>447</a>
<a href=#448 id=448 data-nosnippet>448</a> <span class="doccomment">/// Returns a type representing this subscriber's view of the current span.
<a href=#449 id=449 data-nosnippet>449</a> ///
<a href=#450 id=450 data-nosnippet>450</a> /// If subscribers track a current span, they should override this function
<a href=#451 id=451 data-nosnippet>451</a> /// to return [`Current::new`] if the thread from which this method is
<a href=#452 id=452 data-nosnippet>452</a> /// called is inside a span, or [`Current::none`] if the thread is not
<a href=#453 id=453 data-nosnippet>453</a> /// inside a span.
<a href=#454 id=454 data-nosnippet>454</a> ///
<a href=#455 id=455 data-nosnippet>455</a> /// By default, this returns a value indicating that the subscriber
<a href=#456 id=456 data-nosnippet>456</a> /// does **not** track what span is current. If the subscriber does not
<a href=#457 id=457 data-nosnippet>457</a> /// implement a current span, it should not override this method.
<a href=#458 id=458 data-nosnippet>458</a> ///
<a href=#459 id=459 data-nosnippet>459</a> /// [`Current::new`]: super::span::Current#tymethod.new
<a href=#460 id=460 data-nosnippet>460</a> /// [`Current::none`]: super::span::Current#tymethod.none
<a href=#461 id=461 data-nosnippet>461</a> </span><span class="kw">fn </span>current_span(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; span::Current {
<a href=#462 id=462 data-nosnippet>462</a> span::Current::unknown()
<a href=#463 id=463 data-nosnippet>463</a> }
<a href=#464 id=464 data-nosnippet>464</a>
<a href=#465 id=465 data-nosnippet>465</a> <span class="comment">// === Downcasting methods ================================================
<a href=#466 id=466 data-nosnippet>466</a>
<a href=#467 id=467 data-nosnippet>467</a> </span><span class="doccomment">/// If `self` is the same type as the provided `TypeId`, returns an untyped
<a href=#468 id=468 data-nosnippet>468</a> /// `*const` pointer to that type. Otherwise, returns `None`.
<a href=#469 id=469 data-nosnippet>469</a> ///
<a href=#470 id=470 data-nosnippet>470</a> /// If you wish to downcast a `Subscriber`, it is strongly advised to use
<a href=#471 id=471 data-nosnippet>471</a> /// the safe API provided by [`downcast_ref`] instead.
<a href=#472 id=472 data-nosnippet>472</a> ///
<a href=#473 id=473 data-nosnippet>473</a> /// This API is required for `downcast_raw` to be a trait method; a method
<a href=#474 id=474 data-nosnippet>474</a> /// signature like [`downcast_ref`] (with a generic type parameter) is not
<a href=#475 id=475 data-nosnippet>475</a> /// object-safe, and thus cannot be a trait method for `Subscriber`. This
<a href=#476 id=476 data-nosnippet>476</a> /// means that if we only exposed `downcast_ref`, `Subscriber`
<a href=#477 id=477 data-nosnippet>477</a> /// implementations could not override the downcasting behavior
<a href=#478 id=478 data-nosnippet>478</a> ///
<a href=#479 id=479 data-nosnippet>479</a> /// This method may be overridden by "fan out" or "chained" subscriber
<a href=#480 id=480 data-nosnippet>480</a> /// implementations which consist of multiple composed types. Such
<a href=#481 id=481 data-nosnippet>481</a> /// subscribers might allow `downcast_raw` by returning references to those
<a href=#482 id=482 data-nosnippet>482</a> /// component if they contain components with the given `TypeId`.
<a href=#483 id=483 data-nosnippet>483</a> ///
<a href=#484 id=484 data-nosnippet>484</a> /// # Safety
<a href=#485 id=485 data-nosnippet>485</a> ///
<a href=#486 id=486 data-nosnippet>486</a> /// The [`downcast_ref`] method expects that the pointer returned by
<a href=#487 id=487 data-nosnippet>487</a> /// `downcast_raw` is non-null and points to a valid instance of the type
<a href=#488 id=488 data-nosnippet>488</a> /// with the provided `TypeId`. Failure to ensure this will result in
<a href=#489 id=489 data-nosnippet>489</a> /// undefined behaviour, so implementing `downcast_raw` is unsafe.
<a href=#490 id=490 data-nosnippet>490</a> ///
<a href=#491 id=491 data-nosnippet>491</a> /// [`downcast_ref`]: #method.downcast_ref
<a href=#492 id=492 data-nosnippet>492</a> </span><span class="kw">unsafe fn </span>downcast_raw(<span class="kw-2">&amp;</span><span class="self">self</span>, id: TypeId) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">*const </span>()&gt; {
<a href=#493 id=493 data-nosnippet>493</a> <span class="kw">if </span>id == TypeId::of::&lt;<span class="self">Self</span>&gt;() {
<a href=#494 id=494 data-nosnippet>494</a> <span class="prelude-val">Some</span>(<span class="self">self </span><span class="kw">as </span><span class="kw-2">*const </span><span class="self">Self </span><span class="kw">as </span><span class="kw-2">*const </span>())
<a href=#495 id=495 data-nosnippet>495</a> } <span class="kw">else </span>{
<a href=#496 id=496 data-nosnippet>496</a> <span class="prelude-val">None
<a href=#497 id=497 data-nosnippet>497</a> </span>}
<a href=#498 id=498 data-nosnippet>498</a> }
<a href=#499 id=499 data-nosnippet>499</a>}
<a href=#500 id=500 data-nosnippet>500</a>
<a href=#501 id=501 data-nosnippet>501</a><span class="kw">impl dyn </span>Subscriber {
<a href=#502 id=502 data-nosnippet>502</a> <span class="doccomment">/// Returns `true` if this `Subscriber` is the same type as `T`.
<a href=#503 id=503 data-nosnippet>503</a> </span><span class="kw">pub fn </span>is&lt;T: Any&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#504 id=504 data-nosnippet>504</a> <span class="self">self</span>.downcast_ref::&lt;T&gt;().is_some()
<a href=#505 id=505 data-nosnippet>505</a> }
<a href=#506 id=506 data-nosnippet>506</a>
<a href=#507 id=507 data-nosnippet>507</a> <span class="doccomment">/// Returns some reference to this `Subscriber` value if it is of type `T`,
<a href=#508 id=508 data-nosnippet>508</a> /// or `None` if it isn't.
<a href=#509 id=509 data-nosnippet>509</a> </span><span class="kw">pub fn </span>downcast_ref&lt;T: Any&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>T&gt; {
<a href=#510 id=510 data-nosnippet>510</a> <span class="kw">unsafe </span>{
<a href=#511 id=511 data-nosnippet>511</a> <span class="kw">let </span>raw = <span class="self">self</span>.downcast_raw(TypeId::of::&lt;T&gt;())<span class="question-mark">?</span>;
<a href=#512 id=512 data-nosnippet>512</a> <span class="kw">if </span>raw.is_null() {
<a href=#513 id=513 data-nosnippet>513</a> <span class="prelude-val">None
<a href=#514 id=514 data-nosnippet>514</a> </span>} <span class="kw">else </span>{
<a href=#515 id=515 data-nosnippet>515</a> <span class="prelude-val">Some</span>(<span class="kw-2">&amp;*</span>(raw <span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_</span>))
<a href=#516 id=516 data-nosnippet>516</a> }
<a href=#517 id=517 data-nosnippet>517</a> }
<a href=#518 id=518 data-nosnippet>518</a> }
<a href=#519 id=519 data-nosnippet>519</a>}
<a href=#520 id=520 data-nosnippet>520</a>
<a href=#521 id=521 data-nosnippet>521</a><span class="kw">impl dyn </span>Subscriber + Send {
<a href=#522 id=522 data-nosnippet>522</a> <span class="doccomment">/// Returns `true` if this [`Subscriber`] is the same type as `T`.
<a href=#523 id=523 data-nosnippet>523</a> </span><span class="kw">pub fn </span>is&lt;T: Any&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#524 id=524 data-nosnippet>524</a> <span class="self">self</span>.downcast_ref::&lt;T&gt;().is_some()
<a href=#525 id=525 data-nosnippet>525</a> }
<a href=#526 id=526 data-nosnippet>526</a>
<a href=#527 id=527 data-nosnippet>527</a> <span class="doccomment">/// Returns some reference to this [`Subscriber`] value if it is of type `T`,
<a href=#528 id=528 data-nosnippet>528</a> /// or `None` if it isn't.
<a href=#529 id=529 data-nosnippet>529</a> </span><span class="kw">pub fn </span>downcast_ref&lt;T: Any&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>T&gt; {
<a href=#530 id=530 data-nosnippet>530</a> <span class="kw">unsafe </span>{
<a href=#531 id=531 data-nosnippet>531</a> <span class="kw">let </span>raw = <span class="self">self</span>.downcast_raw(TypeId::of::&lt;T&gt;())<span class="question-mark">?</span>;
<a href=#532 id=532 data-nosnippet>532</a> <span class="kw">if </span>raw.is_null() {
<a href=#533 id=533 data-nosnippet>533</a> <span class="prelude-val">None
<a href=#534 id=534 data-nosnippet>534</a> </span>} <span class="kw">else </span>{
<a href=#535 id=535 data-nosnippet>535</a> <span class="prelude-val">Some</span>(<span class="kw-2">&amp;*</span>(raw <span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_</span>))
<a href=#536 id=536 data-nosnippet>536</a> }
<a href=#537 id=537 data-nosnippet>537</a> }
<a href=#538 id=538 data-nosnippet>538</a> }
<a href=#539 id=539 data-nosnippet>539</a>}
<a href=#540 id=540 data-nosnippet>540</a>
<a href=#541 id=541 data-nosnippet>541</a><span class="kw">impl dyn </span>Subscriber + Sync {
<a href=#542 id=542 data-nosnippet>542</a> <span class="doccomment">/// Returns `true` if this [`Subscriber`] is the same type as `T`.
<a href=#543 id=543 data-nosnippet>543</a> </span><span class="kw">pub fn </span>is&lt;T: Any&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#544 id=544 data-nosnippet>544</a> <span class="self">self</span>.downcast_ref::&lt;T&gt;().is_some()
<a href=#545 id=545 data-nosnippet>545</a> }
<a href=#546 id=546 data-nosnippet>546</a>
<a href=#547 id=547 data-nosnippet>547</a> <span class="doccomment">/// Returns some reference to this `[`Subscriber`] value if it is of type `T`,
<a href=#548 id=548 data-nosnippet>548</a> /// or `None` if it isn't.
<a href=#549 id=549 data-nosnippet>549</a> </span><span class="kw">pub fn </span>downcast_ref&lt;T: Any&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>T&gt; {
<a href=#550 id=550 data-nosnippet>550</a> <span class="kw">unsafe </span>{
<a href=#551 id=551 data-nosnippet>551</a> <span class="kw">let </span>raw = <span class="self">self</span>.downcast_raw(TypeId::of::&lt;T&gt;())<span class="question-mark">?</span>;
<a href=#552 id=552 data-nosnippet>552</a> <span class="kw">if </span>raw.is_null() {
<a href=#553 id=553 data-nosnippet>553</a> <span class="prelude-val">None
<a href=#554 id=554 data-nosnippet>554</a> </span>} <span class="kw">else </span>{
<a href=#555 id=555 data-nosnippet>555</a> <span class="prelude-val">Some</span>(<span class="kw-2">&amp;*</span>(raw <span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_</span>))
<a href=#556 id=556 data-nosnippet>556</a> }
<a href=#557 id=557 data-nosnippet>557</a> }
<a href=#558 id=558 data-nosnippet>558</a> }
<a href=#559 id=559 data-nosnippet>559</a>}
<a href=#560 id=560 data-nosnippet>560</a>
<a href=#561 id=561 data-nosnippet>561</a><span class="kw">impl dyn </span>Subscriber + Send + Sync {
<a href=#562 id=562 data-nosnippet>562</a> <span class="doccomment">/// Returns `true` if this [`Subscriber`] is the same type as `T`.
<a href=#563 id=563 data-nosnippet>563</a> </span><span class="kw">pub fn </span>is&lt;T: Any&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#564 id=564 data-nosnippet>564</a> <span class="self">self</span>.downcast_ref::&lt;T&gt;().is_some()
<a href=#565 id=565 data-nosnippet>565</a> }
<a href=#566 id=566 data-nosnippet>566</a>
<a href=#567 id=567 data-nosnippet>567</a> <span class="doccomment">/// Returns some reference to this [`Subscriber`] value if it is of type `T`,
<a href=#568 id=568 data-nosnippet>568</a> /// or `None` if it isn't.
<a href=#569 id=569 data-nosnippet>569</a> </span><span class="kw">pub fn </span>downcast_ref&lt;T: Any&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>T&gt; {
<a href=#570 id=570 data-nosnippet>570</a> <span class="kw">unsafe </span>{
<a href=#571 id=571 data-nosnippet>571</a> <span class="kw">let </span>raw = <span class="self">self</span>.downcast_raw(TypeId::of::&lt;T&gt;())<span class="question-mark">?</span>;
<a href=#572 id=572 data-nosnippet>572</a> <span class="kw">if </span>raw.is_null() {
<a href=#573 id=573 data-nosnippet>573</a> <span class="prelude-val">None
<a href=#574 id=574 data-nosnippet>574</a> </span>} <span class="kw">else </span>{
<a href=#575 id=575 data-nosnippet>575</a> <span class="prelude-val">Some</span>(<span class="kw-2">&amp;*</span>(raw <span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_</span>))
<a href=#576 id=576 data-nosnippet>576</a> }
<a href=#577 id=577 data-nosnippet>577</a> }
<a href=#578 id=578 data-nosnippet>578</a> }
<a href=#579 id=579 data-nosnippet>579</a>}
<a href=#580 id=580 data-nosnippet>580</a>
<a href=#581 id=581 data-nosnippet>581</a><span class="doccomment">/// Indicates a [`Subscriber`]'s interest in a particular callsite.
<a href=#582 id=582 data-nosnippet>582</a>///
<a href=#583 id=583 data-nosnippet>583</a>/// `Subscriber`s return an `Interest` from their [`register_callsite`] methods
<a href=#584 id=584 data-nosnippet>584</a>/// in order to determine whether that span should be enabled or disabled.
<a href=#585 id=585 data-nosnippet>585</a>///
<a href=#586 id=586 data-nosnippet>586</a>/// [`Subscriber`]: super::Subscriber
<a href=#587 id=587 data-nosnippet>587</a>/// [`register_callsite`]: super::Subscriber::register_callsite
<a href=#588 id=588 data-nosnippet>588</a></span><span class="attr">#[derive(Clone, Debug)]
<a href=#589 id=589 data-nosnippet>589</a></span><span class="kw">pub struct </span>Interest(InterestKind);
<a href=#590 id=590 data-nosnippet>590</a>
<a href=#591 id=591 data-nosnippet>591</a><span class="attr">#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
<a href=#592 id=592 data-nosnippet>592</a></span><span class="kw">enum </span>InterestKind {
<a href=#593 id=593 data-nosnippet>593</a> Never = <span class="number">0</span>,
<a href=#594 id=594 data-nosnippet>594</a> Sometimes = <span class="number">1</span>,
<a href=#595 id=595 data-nosnippet>595</a> Always = <span class="number">2</span>,
<a href=#596 id=596 data-nosnippet>596</a>}
<a href=#597 id=597 data-nosnippet>597</a>
<a href=#598 id=598 data-nosnippet>598</a><span class="kw">impl </span>Interest {
<a href=#599 id=599 data-nosnippet>599</a> <span class="doccomment">/// Returns an `Interest` indicating that the subscriber is never interested
<a href=#600 id=600 data-nosnippet>600</a> /// in being notified about a callsite.
<a href=#601 id=601 data-nosnippet>601</a> ///
<a href=#602 id=602 data-nosnippet>602</a> /// If all active subscribers are `never()` interested in a callsite, it will
<a href=#603 id=603 data-nosnippet>603</a> /// be completely disabled unless a new subscriber becomes active.
<a href=#604 id=604 data-nosnippet>604</a> </span><span class="attr">#[inline]
<a href=#605 id=605 data-nosnippet>605</a> </span><span class="kw">pub fn </span>never() -&gt; <span class="self">Self </span>{
<a href=#606 id=606 data-nosnippet>606</a> Interest(InterestKind::Never)
<a href=#607 id=607 data-nosnippet>607</a> }
<a href=#608 id=608 data-nosnippet>608</a>
<a href=#609 id=609 data-nosnippet>609</a> <span class="doccomment">/// Returns an `Interest` indicating the subscriber is sometimes interested
<a href=#610 id=610 data-nosnippet>610</a> /// in being notified about a callsite.
<a href=#611 id=611 data-nosnippet>611</a> ///
<a href=#612 id=612 data-nosnippet>612</a> /// If all active subscribers are `sometimes` or `never` interested in a
<a href=#613 id=613 data-nosnippet>613</a> /// callsite, the currently active subscriber will be asked to filter that
<a href=#614 id=614 data-nosnippet>614</a> /// callsite every time it creates a span. This will be the case until a new
<a href=#615 id=615 data-nosnippet>615</a> /// subscriber expresses that it is `always` interested in the callsite.
<a href=#616 id=616 data-nosnippet>616</a> </span><span class="attr">#[inline]
<a href=#617 id=617 data-nosnippet>617</a> </span><span class="kw">pub fn </span>sometimes() -&gt; <span class="self">Self </span>{
<a href=#618 id=618 data-nosnippet>618</a> Interest(InterestKind::Sometimes)
<a href=#619 id=619 data-nosnippet>619</a> }
<a href=#620 id=620 data-nosnippet>620</a>
<a href=#621 id=621 data-nosnippet>621</a> <span class="doccomment">/// Returns an `Interest` indicating the subscriber is always interested in
<a href=#622 id=622 data-nosnippet>622</a> /// being notified about a callsite.
<a href=#623 id=623 data-nosnippet>623</a> ///
<a href=#624 id=624 data-nosnippet>624</a> /// If any subscriber expresses that it is `always()` interested in a given
<a href=#625 id=625 data-nosnippet>625</a> /// callsite, then the callsite will always be enabled.
<a href=#626 id=626 data-nosnippet>626</a> </span><span class="attr">#[inline]
<a href=#627 id=627 data-nosnippet>627</a> </span><span class="kw">pub fn </span>always() -&gt; <span class="self">Self </span>{
<a href=#628 id=628 data-nosnippet>628</a> Interest(InterestKind::Always)
<a href=#629 id=629 data-nosnippet>629</a> }
<a href=#630 id=630 data-nosnippet>630</a>
<a href=#631 id=631 data-nosnippet>631</a> <span class="doccomment">/// Returns `true` if the subscriber is never interested in being notified
<a href=#632 id=632 data-nosnippet>632</a> /// about this callsite.
<a href=#633 id=633 data-nosnippet>633</a> </span><span class="attr">#[inline]
<a href=#634 id=634 data-nosnippet>634</a> </span><span class="kw">pub fn </span>is_never(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#635 id=635 data-nosnippet>635</a> <span class="macro">matches!</span>(<span class="self">self</span>.<span class="number">0</span>, InterestKind::Never)
<a href=#636 id=636 data-nosnippet>636</a> }
<a href=#637 id=637 data-nosnippet>637</a>
<a href=#638 id=638 data-nosnippet>638</a> <span class="doccomment">/// Returns `true` if the subscriber is sometimes interested in being notified
<a href=#639 id=639 data-nosnippet>639</a> /// about this callsite.
<a href=#640 id=640 data-nosnippet>640</a> </span><span class="attr">#[inline]
<a href=#641 id=641 data-nosnippet>641</a> </span><span class="kw">pub fn </span>is_sometimes(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#642 id=642 data-nosnippet>642</a> <span class="macro">matches!</span>(<span class="self">self</span>.<span class="number">0</span>, InterestKind::Sometimes)
<a href=#643 id=643 data-nosnippet>643</a> }
<a href=#644 id=644 data-nosnippet>644</a>
<a href=#645 id=645 data-nosnippet>645</a> <span class="doccomment">/// Returns `true` if the subscriber is always interested in being notified
<a href=#646 id=646 data-nosnippet>646</a> /// about this callsite.
<a href=#647 id=647 data-nosnippet>647</a> </span><span class="attr">#[inline]
<a href=#648 id=648 data-nosnippet>648</a> </span><span class="kw">pub fn </span>is_always(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
<a href=#649 id=649 data-nosnippet>649</a> <span class="macro">matches!</span>(<span class="self">self</span>.<span class="number">0</span>, InterestKind::Always)
<a href=#650 id=650 data-nosnippet>650</a> }
<a href=#651 id=651 data-nosnippet>651</a>
<a href=#652 id=652 data-nosnippet>652</a> <span class="doccomment">/// Returns the common interest between these two Interests.
<a href=#653 id=653 data-nosnippet>653</a> ///
<a href=#654 id=654 data-nosnippet>654</a> /// If both interests are the same, this propagates that interest.
<a href=#655 id=655 data-nosnippet>655</a> /// Otherwise, if they differ, the result must always be
<a href=#656 id=656 data-nosnippet>656</a> /// `Interest::sometimes` --- if the two subscribers differ in opinion, we
<a href=#657 id=657 data-nosnippet>657</a> /// will have to ask the current subscriber what it thinks, no matter what.
<a href=#658 id=658 data-nosnippet>658</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>and(<span class="self">self</span>, rhs: Interest) -&gt; <span class="self">Self </span>{
<a href=#659 id=659 data-nosnippet>659</a> <span class="kw">if </span><span class="self">self</span>.<span class="number">0 </span>== rhs.<span class="number">0 </span>{
<a href=#660 id=660 data-nosnippet>660</a> <span class="self">self
<a href=#661 id=661 data-nosnippet>661</a> </span>} <span class="kw">else </span>{
<a href=#662 id=662 data-nosnippet>662</a> Interest::sometimes()
<a href=#663 id=663 data-nosnippet>663</a> }
<a href=#664 id=664 data-nosnippet>664</a> }
<a href=#665 id=665 data-nosnippet>665</a>}
<a href=#666 id=666 data-nosnippet>666</a>
<a href=#667 id=667 data-nosnippet>667</a><span class="doccomment">/// A no-op [`Subscriber`].
<a href=#668 id=668 data-nosnippet>668</a>///
<a href=#669 id=669 data-nosnippet>669</a>/// [`NoSubscriber`] implements the [`Subscriber`] trait by never being enabled,
<a href=#670 id=670 data-nosnippet>670</a>/// never being interested in any callsite, and dropping all spans and events.
<a href=#671 id=671 data-nosnippet>671</a></span><span class="attr">#[derive(Copy, Clone, Debug, Default)]
<a href=#672 id=672 data-nosnippet>672</a></span><span class="kw">pub struct </span>NoSubscriber(());
<a href=#673 id=673 data-nosnippet>673</a>
<a href=#674 id=674 data-nosnippet>674</a><span class="kw">impl </span>Subscriber <span class="kw">for </span>NoSubscriber {
<a href=#675 id=675 data-nosnippet>675</a> <span class="attr">#[inline]
<a href=#676 id=676 data-nosnippet>676</a> </span><span class="kw">fn </span>register_callsite(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;) -&gt; Interest {
<a href=#677 id=677 data-nosnippet>677</a> Interest::never()
<a href=#678 id=678 data-nosnippet>678</a> }
<a href=#679 id=679 data-nosnippet>679</a>
<a href=#680 id=680 data-nosnippet>680</a> <span class="kw">fn </span>new_span(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="kw">_</span>: <span class="kw-2">&amp;</span>span::Attributes&lt;<span class="lifetime">'_</span>&gt;) -&gt; span::Id {
<a href=#681 id=681 data-nosnippet>681</a> span::Id::from_u64(<span class="number">0xDEAD</span>)
<a href=#682 id=682 data-nosnippet>682</a> }
<a href=#683 id=683 data-nosnippet>683</a>
<a href=#684 id=684 data-nosnippet>684</a> <span class="kw">fn </span>event(<span class="kw-2">&amp;</span><span class="self">self</span>, _event: <span class="kw-2">&amp;</span>Event&lt;<span class="lifetime">'_</span>&gt;) {}
<a href=#685 id=685 data-nosnippet>685</a>
<a href=#686 id=686 data-nosnippet>686</a> <span class="kw">fn </span>record(<span class="kw-2">&amp;</span><span class="self">self</span>, _span: <span class="kw-2">&amp;</span>span::Id, _values: <span class="kw-2">&amp;</span>span::Record&lt;<span class="lifetime">'_</span>&gt;) {}
<a href=#687 id=687 data-nosnippet>687</a>
<a href=#688 id=688 data-nosnippet>688</a> <span class="kw">fn </span>record_follows_from(<span class="kw-2">&amp;</span><span class="self">self</span>, _span: <span class="kw-2">&amp;</span>span::Id, _follows: <span class="kw-2">&amp;</span>span::Id) {}
<a href=#689 id=689 data-nosnippet>689</a>
<a href=#690 id=690 data-nosnippet>690</a> <span class="attr">#[inline]
<a href=#691 id=691 data-nosnippet>691</a> </span><span class="kw">fn </span>enabled(<span class="kw-2">&amp;</span><span class="self">self</span>, _metadata: <span class="kw-2">&amp;</span>Metadata&lt;<span class="lifetime">'_</span>&gt;) -&gt; bool {
<a href=#692 id=692 data-nosnippet>692</a> <span class="bool-val">false
<a href=#693 id=693 data-nosnippet>693</a> </span>}
<a href=#694 id=694 data-nosnippet>694</a>
<a href=#695 id=695 data-nosnippet>695</a> <span class="kw">fn </span>enter(<span class="kw-2">&amp;</span><span class="self">self</span>, _span: <span class="kw-2">&amp;</span>span::Id) {}
<a href=#696 id=696 data-nosnippet>696</a> <span class="kw">fn </span>exit(<span class="kw-2">&amp;</span><span class="self">self</span>, _span: <span class="kw-2">&amp;</span>span::Id) {}
<a href=#697 id=697 data-nosnippet>697</a>}
<a href=#698 id=698 data-nosnippet>698</a>
<a href=#699 id=699 data-nosnippet>699</a><span class="kw">impl </span>NoSubscriber {
<a href=#700 id=700 data-nosnippet>700</a> <span class="doccomment">/// Returns a new `NoSubscriber`.
<a href=#701 id=701 data-nosnippet>701</a> </span><span class="attr">#[must_use]
<a href=#702 id=702 data-nosnippet>702</a> </span><span class="kw">pub const fn </span>new() -&gt; <span class="self">Self </span>{
<a href=#703 id=703 data-nosnippet>703</a> <span class="self">Self</span>(())
<a href=#704 id=704 data-nosnippet>704</a> }
<a href=#705 id=705 data-nosnippet>705</a>}
<a href=#706 id=706 data-nosnippet>706</a>
<a href=#707 id=707 data-nosnippet>707</a><span class="kw">impl</span>&lt;S&gt; Subscriber <span class="kw">for </span>Box&lt;S&gt;
<a href=#708 id=708 data-nosnippet>708</a><span class="kw">where
<a href=#709 id=709 data-nosnippet>709</a> </span>S: Subscriber + <span class="question-mark">?</span>Sized,
<a href=#710 id=710 data-nosnippet>710</a>{
<a href=#711 id=711 data-nosnippet>711</a> <span class="attr">#[inline]
<a href=#712 id=712 data-nosnippet>712</a> </span><span class="kw">fn </span>register_callsite(<span class="kw-2">&amp;</span><span class="self">self</span>, metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;) -&gt; Interest {
<a href=#713 id=713 data-nosnippet>713</a> <span class="self">self</span>.as_ref().register_callsite(metadata)
<a href=#714 id=714 data-nosnippet>714</a> }
<a href=#715 id=715 data-nosnippet>715</a>
<a href=#716 id=716 data-nosnippet>716</a> <span class="attr">#[inline]
<a href=#717 id=717 data-nosnippet>717</a> </span><span class="kw">fn </span>enabled(<span class="kw-2">&amp;</span><span class="self">self</span>, metadata: <span class="kw-2">&amp;</span>Metadata&lt;<span class="lifetime">'_</span>&gt;) -&gt; bool {
<a href=#718 id=718 data-nosnippet>718</a> <span class="self">self</span>.as_ref().enabled(metadata)
<a href=#719 id=719 data-nosnippet>719</a> }
<a href=#720 id=720 data-nosnippet>720</a>
<a href=#721 id=721 data-nosnippet>721</a> <span class="attr">#[inline]
<a href=#722 id=722 data-nosnippet>722</a> </span><span class="kw">fn </span>max_level_hint(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;LevelFilter&gt; {
<a href=#723 id=723 data-nosnippet>723</a> <span class="self">self</span>.as_ref().max_level_hint()
<a href=#724 id=724 data-nosnippet>724</a> }
<a href=#725 id=725 data-nosnippet>725</a>
<a href=#726 id=726 data-nosnippet>726</a> <span class="attr">#[inline]
<a href=#727 id=727 data-nosnippet>727</a> </span><span class="kw">fn </span>new_span(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Attributes&lt;<span class="lifetime">'_</span>&gt;) -&gt; span::Id {
<a href=#728 id=728 data-nosnippet>728</a> <span class="self">self</span>.as_ref().new_span(span)
<a href=#729 id=729 data-nosnippet>729</a> }
<a href=#730 id=730 data-nosnippet>730</a>
<a href=#731 id=731 data-nosnippet>731</a> <span class="attr">#[inline]
<a href=#732 id=732 data-nosnippet>732</a> </span><span class="kw">fn </span>record(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id, values: <span class="kw-2">&amp;</span>span::Record&lt;<span class="lifetime">'_</span>&gt;) {
<a href=#733 id=733 data-nosnippet>733</a> <span class="self">self</span>.as_ref().record(span, values)
<a href=#734 id=734 data-nosnippet>734</a> }
<a href=#735 id=735 data-nosnippet>735</a>
<a href=#736 id=736 data-nosnippet>736</a> <span class="attr">#[inline]
<a href=#737 id=737 data-nosnippet>737</a> </span><span class="kw">fn </span>record_follows_from(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id, follows: <span class="kw-2">&amp;</span>span::Id) {
<a href=#738 id=738 data-nosnippet>738</a> <span class="self">self</span>.as_ref().record_follows_from(span, follows)
<a href=#739 id=739 data-nosnippet>739</a> }
<a href=#740 id=740 data-nosnippet>740</a>
<a href=#741 id=741 data-nosnippet>741</a> <span class="attr">#[inline]
<a href=#742 id=742 data-nosnippet>742</a> </span><span class="kw">fn </span>event_enabled(<span class="kw-2">&amp;</span><span class="self">self</span>, event: <span class="kw-2">&amp;</span>Event&lt;<span class="lifetime">'_</span>&gt;) -&gt; bool {
<a href=#743 id=743 data-nosnippet>743</a> <span class="self">self</span>.as_ref().event_enabled(event)
<a href=#744 id=744 data-nosnippet>744</a> }
<a href=#745 id=745 data-nosnippet>745</a>
<a href=#746 id=746 data-nosnippet>746</a> <span class="attr">#[inline]
<a href=#747 id=747 data-nosnippet>747</a> </span><span class="kw">fn </span>event(<span class="kw-2">&amp;</span><span class="self">self</span>, event: <span class="kw-2">&amp;</span>Event&lt;<span class="lifetime">'_</span>&gt;) {
<a href=#748 id=748 data-nosnippet>748</a> <span class="self">self</span>.as_ref().event(event)
<a href=#749 id=749 data-nosnippet>749</a> }
<a href=#750 id=750 data-nosnippet>750</a>
<a href=#751 id=751 data-nosnippet>751</a> <span class="attr">#[inline]
<a href=#752 id=752 data-nosnippet>752</a> </span><span class="kw">fn </span>enter(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id) {
<a href=#753 id=753 data-nosnippet>753</a> <span class="self">self</span>.as_ref().enter(span)
<a href=#754 id=754 data-nosnippet>754</a> }
<a href=#755 id=755 data-nosnippet>755</a>
<a href=#756 id=756 data-nosnippet>756</a> <span class="attr">#[inline]
<a href=#757 id=757 data-nosnippet>757</a> </span><span class="kw">fn </span>exit(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id) {
<a href=#758 id=758 data-nosnippet>758</a> <span class="self">self</span>.as_ref().exit(span)
<a href=#759 id=759 data-nosnippet>759</a> }
<a href=#760 id=760 data-nosnippet>760</a>
<a href=#761 id=761 data-nosnippet>761</a> <span class="attr">#[inline]
<a href=#762 id=762 data-nosnippet>762</a> </span><span class="kw">fn </span>clone_span(<span class="kw-2">&amp;</span><span class="self">self</span>, id: <span class="kw-2">&amp;</span>span::Id) -&gt; span::Id {
<a href=#763 id=763 data-nosnippet>763</a> <span class="self">self</span>.as_ref().clone_span(id)
<a href=#764 id=764 data-nosnippet>764</a> }
<a href=#765 id=765 data-nosnippet>765</a>
<a href=#766 id=766 data-nosnippet>766</a> <span class="attr">#[inline]
<a href=#767 id=767 data-nosnippet>767</a> </span><span class="kw">fn </span>try_close(<span class="kw-2">&amp;</span><span class="self">self</span>, id: span::Id) -&gt; bool {
<a href=#768 id=768 data-nosnippet>768</a> <span class="self">self</span>.as_ref().try_close(id)
<a href=#769 id=769 data-nosnippet>769</a> }
<a href=#770 id=770 data-nosnippet>770</a>
<a href=#771 id=771 data-nosnippet>771</a> <span class="attr">#[inline]
<a href=#772 id=772 data-nosnippet>772</a> #[allow(deprecated)]
<a href=#773 id=773 data-nosnippet>773</a> </span><span class="kw">fn </span>drop_span(<span class="kw-2">&amp;</span><span class="self">self</span>, id: span::Id) {
<a href=#774 id=774 data-nosnippet>774</a> <span class="self">self</span>.as_ref().try_close(id);
<a href=#775 id=775 data-nosnippet>775</a> }
<a href=#776 id=776 data-nosnippet>776</a>
<a href=#777 id=777 data-nosnippet>777</a> <span class="attr">#[inline]
<a href=#778 id=778 data-nosnippet>778</a> </span><span class="kw">fn </span>current_span(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; span::Current {
<a href=#779 id=779 data-nosnippet>779</a> <span class="self">self</span>.as_ref().current_span()
<a href=#780 id=780 data-nosnippet>780</a> }
<a href=#781 id=781 data-nosnippet>781</a>
<a href=#782 id=782 data-nosnippet>782</a> <span class="attr">#[inline]
<a href=#783 id=783 data-nosnippet>783</a> </span><span class="kw">unsafe fn </span>downcast_raw(<span class="kw-2">&amp;</span><span class="self">self</span>, id: TypeId) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">*const </span>()&gt; {
<a href=#784 id=784 data-nosnippet>784</a> <span class="kw">if </span>id == TypeId::of::&lt;<span class="self">Self</span>&gt;() {
<a href=#785 id=785 data-nosnippet>785</a> <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="self">self </span><span class="kw">as </span><span class="kw-2">*const </span><span class="self">Self </span><span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_</span>);
<a href=#786 id=786 data-nosnippet>786</a> }
<a href=#787 id=787 data-nosnippet>787</a>
<a href=#788 id=788 data-nosnippet>788</a> <span class="kw">unsafe </span>{ <span class="self">self</span>.as_ref().downcast_raw(id) }
<a href=#789 id=789 data-nosnippet>789</a> }
<a href=#790 id=790 data-nosnippet>790</a>}
<a href=#791 id=791 data-nosnippet>791</a>
<a href=#792 id=792 data-nosnippet>792</a><span class="kw">impl</span>&lt;S&gt; Subscriber <span class="kw">for </span>Arc&lt;S&gt;
<a href=#793 id=793 data-nosnippet>793</a><span class="kw">where
<a href=#794 id=794 data-nosnippet>794</a> </span>S: Subscriber + <span class="question-mark">?</span>Sized,
<a href=#795 id=795 data-nosnippet>795</a>{
<a href=#796 id=796 data-nosnippet>796</a> <span class="attr">#[inline]
<a href=#797 id=797 data-nosnippet>797</a> </span><span class="kw">fn </span>register_callsite(<span class="kw-2">&amp;</span><span class="self">self</span>, metadata: <span class="kw-2">&amp;</span><span class="lifetime">'static </span>Metadata&lt;<span class="lifetime">'static</span>&gt;) -&gt; Interest {
<a href=#798 id=798 data-nosnippet>798</a> <span class="self">self</span>.as_ref().register_callsite(metadata)
<a href=#799 id=799 data-nosnippet>799</a> }
<a href=#800 id=800 data-nosnippet>800</a>
<a href=#801 id=801 data-nosnippet>801</a> <span class="attr">#[inline]
<a href=#802 id=802 data-nosnippet>802</a> </span><span class="kw">fn </span>enabled(<span class="kw-2">&amp;</span><span class="self">self</span>, metadata: <span class="kw-2">&amp;</span>Metadata&lt;<span class="lifetime">'_</span>&gt;) -&gt; bool {
<a href=#803 id=803 data-nosnippet>803</a> <span class="self">self</span>.as_ref().enabled(metadata)
<a href=#804 id=804 data-nosnippet>804</a> }
<a href=#805 id=805 data-nosnippet>805</a>
<a href=#806 id=806 data-nosnippet>806</a> <span class="attr">#[inline]
<a href=#807 id=807 data-nosnippet>807</a> </span><span class="kw">fn </span>max_level_hint(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;LevelFilter&gt; {
<a href=#808 id=808 data-nosnippet>808</a> <span class="self">self</span>.as_ref().max_level_hint()
<a href=#809 id=809 data-nosnippet>809</a> }
<a href=#810 id=810 data-nosnippet>810</a>
<a href=#811 id=811 data-nosnippet>811</a> <span class="attr">#[inline]
<a href=#812 id=812 data-nosnippet>812</a> </span><span class="kw">fn </span>new_span(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Attributes&lt;<span class="lifetime">'_</span>&gt;) -&gt; span::Id {
<a href=#813 id=813 data-nosnippet>813</a> <span class="self">self</span>.as_ref().new_span(span)
<a href=#814 id=814 data-nosnippet>814</a> }
<a href=#815 id=815 data-nosnippet>815</a>
<a href=#816 id=816 data-nosnippet>816</a> <span class="attr">#[inline]
<a href=#817 id=817 data-nosnippet>817</a> </span><span class="kw">fn </span>record(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id, values: <span class="kw-2">&amp;</span>span::Record&lt;<span class="lifetime">'_</span>&gt;) {
<a href=#818 id=818 data-nosnippet>818</a> <span class="self">self</span>.as_ref().record(span, values)
<a href=#819 id=819 data-nosnippet>819</a> }
<a href=#820 id=820 data-nosnippet>820</a>
<a href=#821 id=821 data-nosnippet>821</a> <span class="attr">#[inline]
<a href=#822 id=822 data-nosnippet>822</a> </span><span class="kw">fn </span>record_follows_from(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id, follows: <span class="kw-2">&amp;</span>span::Id) {
<a href=#823 id=823 data-nosnippet>823</a> <span class="self">self</span>.as_ref().record_follows_from(span, follows)
<a href=#824 id=824 data-nosnippet>824</a> }
<a href=#825 id=825 data-nosnippet>825</a>
<a href=#826 id=826 data-nosnippet>826</a> <span class="attr">#[inline]
<a href=#827 id=827 data-nosnippet>827</a> </span><span class="kw">fn </span>event_enabled(<span class="kw-2">&amp;</span><span class="self">self</span>, event: <span class="kw-2">&amp;</span>Event&lt;<span class="lifetime">'_</span>&gt;) -&gt; bool {
<a href=#828 id=828 data-nosnippet>828</a> <span class="self">self</span>.as_ref().event_enabled(event)
<a href=#829 id=829 data-nosnippet>829</a> }
<a href=#830 id=830 data-nosnippet>830</a>
<a href=#831 id=831 data-nosnippet>831</a> <span class="attr">#[inline]
<a href=#832 id=832 data-nosnippet>832</a> </span><span class="kw">fn </span>event(<span class="kw-2">&amp;</span><span class="self">self</span>, event: <span class="kw-2">&amp;</span>Event&lt;<span class="lifetime">'_</span>&gt;) {
<a href=#833 id=833 data-nosnippet>833</a> <span class="self">self</span>.as_ref().event(event)
<a href=#834 id=834 data-nosnippet>834</a> }
<a href=#835 id=835 data-nosnippet>835</a>
<a href=#836 id=836 data-nosnippet>836</a> <span class="attr">#[inline]
<a href=#837 id=837 data-nosnippet>837</a> </span><span class="kw">fn </span>enter(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id) {
<a href=#838 id=838 data-nosnippet>838</a> <span class="self">self</span>.as_ref().enter(span)
<a href=#839 id=839 data-nosnippet>839</a> }
<a href=#840 id=840 data-nosnippet>840</a>
<a href=#841 id=841 data-nosnippet>841</a> <span class="attr">#[inline]
<a href=#842 id=842 data-nosnippet>842</a> </span><span class="kw">fn </span>exit(<span class="kw-2">&amp;</span><span class="self">self</span>, span: <span class="kw-2">&amp;</span>span::Id) {
<a href=#843 id=843 data-nosnippet>843</a> <span class="self">self</span>.as_ref().exit(span)
<a href=#844 id=844 data-nosnippet>844</a> }
<a href=#845 id=845 data-nosnippet>845</a>
<a href=#846 id=846 data-nosnippet>846</a> <span class="attr">#[inline]
<a href=#847 id=847 data-nosnippet>847</a> </span><span class="kw">fn </span>clone_span(<span class="kw-2">&amp;</span><span class="self">self</span>, id: <span class="kw-2">&amp;</span>span::Id) -&gt; span::Id {
<a href=#848 id=848 data-nosnippet>848</a> <span class="self">self</span>.as_ref().clone_span(id)
<a href=#849 id=849 data-nosnippet>849</a> }
<a href=#850 id=850 data-nosnippet>850</a>
<a href=#851 id=851 data-nosnippet>851</a> <span class="attr">#[inline]
<a href=#852 id=852 data-nosnippet>852</a> </span><span class="kw">fn </span>try_close(<span class="kw-2">&amp;</span><span class="self">self</span>, id: span::Id) -&gt; bool {
<a href=#853 id=853 data-nosnippet>853</a> <span class="self">self</span>.as_ref().try_close(id)
<a href=#854 id=854 data-nosnippet>854</a> }
<a href=#855 id=855 data-nosnippet>855</a>
<a href=#856 id=856 data-nosnippet>856</a> <span class="attr">#[inline]
<a href=#857 id=857 data-nosnippet>857</a> #[allow(deprecated)]
<a href=#858 id=858 data-nosnippet>858</a> </span><span class="kw">fn </span>drop_span(<span class="kw-2">&amp;</span><span class="self">self</span>, id: span::Id) {
<a href=#859 id=859 data-nosnippet>859</a> <span class="self">self</span>.as_ref().try_close(id);
<a href=#860 id=860 data-nosnippet>860</a> }
<a href=#861 id=861 data-nosnippet>861</a>
<a href=#862 id=862 data-nosnippet>862</a> <span class="attr">#[inline]
<a href=#863 id=863 data-nosnippet>863</a> </span><span class="kw">fn </span>current_span(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; span::Current {
<a href=#864 id=864 data-nosnippet>864</a> <span class="self">self</span>.as_ref().current_span()
<a href=#865 id=865 data-nosnippet>865</a> }
<a href=#866 id=866 data-nosnippet>866</a>
<a href=#867 id=867 data-nosnippet>867</a> <span class="attr">#[inline]
<a href=#868 id=868 data-nosnippet>868</a> </span><span class="kw">unsafe fn </span>downcast_raw(<span class="kw-2">&amp;</span><span class="self">self</span>, id: TypeId) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">*const </span>()&gt; {
<a href=#869 id=869 data-nosnippet>869</a> <span class="kw">if </span>id == TypeId::of::&lt;<span class="self">Self</span>&gt;() {
<a href=#870 id=870 data-nosnippet>870</a> <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="self">self </span><span class="kw">as </span><span class="kw-2">*const </span><span class="self">Self </span><span class="kw">as </span><span class="kw-2">*const </span><span class="kw">_</span>);
<a href=#871 id=871 data-nosnippet>871</a> }
<a href=#872 id=872 data-nosnippet>872</a>
<a href=#873 id=873 data-nosnippet>873</a> <span class="kw">unsafe </span>{ <span class="self">self</span>.as_ref().downcast_raw(id) }
<a href=#874 id=874 data-nosnippet>874</a> }
<a href=#875 id=875 data-nosnippet>875</a>}
</code></pre></div></section></main></body></html>