@@ -93,11 +93,13 @@ thread_local! {
9393/// assert_eq!(current.get::<ValueB>(), None);
9494/// ```
9595#[ derive( Clone , Default ) ]
96+ // 16-byte alignment for performance, which should be ok on 32-bit systems too
97+ #[ repr( align( 16 ) ) ]
9698pub struct Context {
9799 #[ cfg( feature = "trace" ) ]
98100 pub ( crate ) span : Option < Arc < SynchronizedSpan > > ,
99101 entries : Option < Arc < EntryMap > > ,
100- suppress_telemetry : bool ,
102+ flags : ContextFlags ,
101103}
102104
103105type EntryMap = HashMap < TypeId , Arc < dyn Any + Sync + Send > , BuildHasherDefault < IdHasher > > ;
@@ -245,7 +247,7 @@ impl Context {
245247 entries,
246248 #[ cfg( feature = "trace" ) ]
247249 span : self . span . clone ( ) ,
248- suppress_telemetry : self . suppress_telemetry ,
250+ flags : self . flags ,
249251 }
250252 }
251253
@@ -335,7 +337,7 @@ impl Context {
335337 /// Returns whether telemetry is suppressed in this context.
336338 #[ inline]
337339 pub fn is_telemetry_suppressed ( & self ) -> bool {
338- self . suppress_telemetry
340+ self . flags . is_telemetry_suppressed ( )
339341 }
340342
341343 /// Returns a new context with telemetry suppression enabled.
@@ -344,7 +346,7 @@ impl Context {
344346 entries : self . entries . clone ( ) ,
345347 #[ cfg( feature = "trace" ) ]
346348 span : self . span . clone ( ) ,
347- suppress_telemetry : true ,
349+ flags : self . flags . with_telemetry_suppressed ( ) ,
348350 }
349351 }
350352
@@ -413,7 +415,7 @@ impl Context {
413415 Self :: map_current ( |cx| Context {
414416 span : Some ( Arc :: new ( value) ) ,
415417 entries : cx. entries . clone ( ) ,
416- suppress_telemetry : cx. suppress_telemetry ,
418+ flags : cx. flags ,
417419 } )
418420 }
419421
@@ -422,7 +424,7 @@ impl Context {
422424 Context {
423425 span : Some ( Arc :: new ( value) ) ,
424426 entries : self . entries . clone ( ) ,
425- suppress_telemetry : self . suppress_telemetry ,
427+ flags : self . flags ,
426428 }
427429 }
428430}
@@ -446,7 +448,7 @@ impl fmt::Debug for Context {
446448 let entries = self . entries . as_ref ( ) . map_or ( 0 , |e| e. len ( ) ) ;
447449
448450 dbg. field ( "entries count" , & entries)
449- . field ( "suppress_telemetry" , & self . suppress_telemetry )
451+ . field ( "suppress_telemetry" , & self . flags . is_telemetry_suppressed ( ) )
450452 . finish ( )
451453 }
452454}
@@ -605,6 +607,23 @@ impl Default for ContextStack {
605607 }
606608}
607609
610+ #[ derive( Clone , Copy , Default ) ]
611+ struct ContextFlags ( usize ) ;
612+
613+ impl ContextFlags {
614+ const TELEMETRY_SUPPRESSED : usize = 1 ;
615+
616+ #[ inline( always) ]
617+ fn is_telemetry_suppressed ( & self ) -> bool {
618+ self . 0 & Self :: TELEMETRY_SUPPRESSED != 0
619+ }
620+
621+ #[ inline( always) ]
622+ fn with_telemetry_suppressed ( & self ) -> Self {
623+ Self ( self . 0 | Self :: TELEMETRY_SUPPRESSED )
624+ }
625+ }
626+
608627#[ cfg( test) ]
609628mod tests {
610629 use super :: * ;
0 commit comments