@@ -51,7 +51,7 @@ mod inner {
5151 pin:: Pin ,
5252 sync:: {
5353 atomic:: { AtomicBool , AtomicI64 , Ordering } ,
54- Arc , Mutex ,
54+ Arc ,
5555 } ,
5656 } ;
5757
@@ -67,7 +67,7 @@ mod inner {
6767 queue_size : Arc < AtomicI64 > ,
6868 queue_size_warning : i64 ,
6969 warning_fired : Arc < AtomicBool > ,
70- creation_backtrace : Arc < Mutex < Backtrace > > ,
70+ creation_backtrace : Arc < Backtrace > ,
7171 }
7272
7373 // Strangely, deriving `Clone` requires that `T` is also `Clone`.
@@ -108,7 +108,7 @@ mod inner {
108108 queue_size : queue_size. clone ( ) ,
109109 queue_size_warning,
110110 warning_fired : Arc :: new ( AtomicBool :: new ( false ) ) ,
111- creation_backtrace : Arc :: new ( Mutex :: new ( Backtrace :: new_unresolved ( ) ) ) ,
111+ creation_backtrace : Arc :: new ( Backtrace :: new_unresolved ( ) ) ,
112112 } ;
113113 let receiver = TracingUnboundedReceiver { inner : r, name, queue_size } ;
114114 ( sender, receiver)
@@ -156,12 +156,12 @@ mod inner {
156156 // `warning_fired` and `queue_size` are not synchronized, so it's possible
157157 // that the warning is fired few times before the `warning_fired` is seen
158158 // by all threads. This seems better than introducing a mutex guarding them.
159- let mut bt = self . creation_backtrace . lock ( ) . expect ( "another thread panicked." ) ;
160- bt . resolve ( ) ;
159+ let mut backtrace = ( * self . creation_backtrace ) . clone ( ) ;
160+ backtrace . resolve ( ) ;
161161 error ! (
162162 "The number of unprocessed messages in channel `{}` reached {}.\n \
163163 The channel was created at:\n {:?}",
164- self . name, self . queue_size_warning, bt ,
164+ self . name, self . queue_size_warning, backtrace ,
165165 ) ;
166166 }
167167
0 commit comments