File tree Expand file tree Collapse file tree 1 file changed +32
-0
lines changed Expand file tree Collapse file tree 1 file changed +32
-0
lines changed Original file line number Diff line number Diff line change @@ -156,6 +156,38 @@ where
156156 }
157157}
158158
159+ impl < S > Drop for SpanMap < S > {
160+ fn drop ( & mut self ) {
161+ struct SendPtr ( * mut [ ( ) ] ) ;
162+ unsafe impl Send for SendPtr { }
163+ static SPAN_MAP_DROP_THREAD : std:: sync:: OnceLock <
164+ std:: sync:: mpsc:: Sender < ( SendPtr , fn ( SendPtr ) ) > ,
165+ > = std:: sync:: OnceLock :: new ( ) ;
166+ SPAN_MAP_DROP_THREAD
167+ . get_or_init ( || {
168+ let ( sender, receiver) = std:: sync:: mpsc:: channel :: < ( SendPtr , fn ( SendPtr ) ) > ( ) ;
169+ std:: thread:: Builder :: new ( )
170+ . name ( "SpanMapDropper" . to_owned ( ) )
171+ . spawn ( move || receiver. iter ( ) . for_each ( |( b, drop) | drop ( b) ) )
172+ . unwrap ( ) ;
173+ sender
174+ } )
175+ . send ( (
176+ unsafe {
177+ SendPtr ( std:: mem:: transmute ( Box :: < [ ( TextSize , SpanData < S > ) ] > :: into_raw (
178+ std:: mem:: take ( & mut self . spans ) . into_boxed_slice ( ) ,
179+ ) ) )
180+ } ,
181+ |b : SendPtr | {
182+ _ = unsafe {
183+ Box :: from_raw ( std:: mem:: transmute :: < _ , * mut [ ( TextSize , SpanData < S > ) ] > ( b. 0 ) )
184+ }
185+ } ,
186+ ) )
187+ . unwrap ( ) ;
188+ }
189+ }
190+
159191#[ derive( PartialEq , Eq , Hash , Debug ) ]
160192pub struct RealSpanMap {
161193 file_id : EditionedFileId ,
You can’t perform that action at this time.
0 commit comments