@@ -458,12 +458,18 @@ mod impls {
458458 pub use super :: * ;
459459 use std:: rc;
460460
461- impl < T > Trace for rc:: Rc < T > {
462- fn trace ( & self , _tracer : & mut Tracer ) { }
461+ impl < T : Trace > Trace for rc:: Rc < T > {
462+ fn trace ( & self , tracer : & mut Tracer ) {
463+ ( * * self ) . trace ( tracer) ;
464+ }
463465 }
464466
465- impl < T > Trace for rc:: Weak < T > {
466- fn trace ( & self , _tracer : & mut Tracer ) { }
467+ impl < T : Trace > Trace for rc:: Weak < T > {
468+ fn trace ( & self , tracer : & mut Tracer ) {
469+ if let Some ( t) = self . upgrade ( ) {
470+ ( * t) . trace ( tracer) ;
471+ }
472+ }
467473 }
468474 }
469475
@@ -484,8 +490,18 @@ mod impls {
484490 pub use super :: * ;
485491 use std:: sync;
486492
487- impl < T > Trace for sync:: Arc < T > {
488- fn trace ( & self , _tracer : & mut Tracer ) { }
493+ impl < T : Trace > Trace for sync:: Arc < T > {
494+ fn trace ( & self , tracer : & mut Tracer ) {
495+ ( * * self ) . trace ( tracer) ;
496+ }
497+ }
498+
499+ impl < T : Trace > Trace for sync:: Weak < T > {
500+ fn trace ( & self , tracer : & mut Tracer ) {
501+ if let Some ( t) = self . upgrade ( ) {
502+ ( * t) . trace ( tracer) ;
503+ }
504+ }
489505 }
490506
491507 impl Trace for sync:: Barrier {
@@ -496,8 +512,12 @@ mod impls {
496512 fn trace ( & self , _tracer : & mut Tracer ) { }
497513 }
498514
499- impl < T > Trace for sync:: Mutex < T > {
500- fn trace ( & self , _tracer : & mut Tracer ) { }
515+ impl < T : Trace > Trace for sync:: Mutex < T > {
516+ fn trace ( & self , tracer : & mut Tracer ) {
517+ if let Ok ( t) = self . lock ( ) {
518+ t. trace ( tracer) ;
519+ }
520+ }
501521 }
502522
503523 impl Trace for sync:: Once {
@@ -510,8 +530,8 @@ mod impls {
510530
511531 impl < T : Trace > Trace for sync:: RwLock < T > {
512532 fn trace ( & self , tracer : & mut Tracer ) {
513- if let Ok ( v ) = self . write ( ) {
514- v . trace ( tracer) ;
533+ if let Ok ( t ) = self . write ( ) {
534+ t . trace ( tracer) ;
515535 }
516536 }
517537 }
0 commit comments