@@ -9,6 +9,13 @@ use std::{
99 path:: Path ,
1010 sync:: OnceLock ,
1111} ;
12+
13+ #[ cfg( not( feature = "performance" ) ) ]
14+ use std:: sync:: { Arc , RwLock } ;
15+
16+ #[ cfg( feature = "performance" ) ]
17+ use dashmap:: { DashMap , Entry , mapref:: one:: Ref } ;
18+
1219use syn:: { parse:: Parse , parse_macro_input, spanned:: Spanned } ;
1320use unic_langid:: LanguageIdentifier ;
1421
@@ -165,10 +172,44 @@ struct DomainSpecificData {
165172 _assets : FileSystemAssets ,
166173}
167174
168- fn domains ( ) -> & ' static dashmap:: DashMap < String , DomainSpecificData > {
169- static DOMAINS : OnceLock < dashmap:: DashMap < String , DomainSpecificData > > = OnceLock :: new ( ) ;
175+ #[ derive( Default ) ]
176+ struct DomainsMap {
177+ #[ cfg( not( feature = "performance" ) ) ]
178+ map : RwLock < HashMap < String , Arc < DomainSpecificData > > > ,
179+
180+ #[ cfg( feature = "performance" ) ]
181+ map : dashmap:: DashMap < String , DomainSpecificData >
182+ }
183+
184+ impl DomainsMap {
185+ #[ cfg( not( feature = "performance" ) ) ]
186+ fn get ( & self , domain : & String ) -> Option < Arc < DomainSpecificData > > {
187+ match self . map . read ( ) . unwrap ( ) . get ( domain) {
188+ None => { None }
189+ Some ( data) => { Some ( data. clone ( ) ) }
190+ }
191+ }
192+
193+ #[ cfg( not( feature = "performance" ) ) ]
194+ fn entry_or_insert ( & self , domain : & String , data : DomainSpecificData ) -> Arc < DomainSpecificData > {
195+ self . map . write ( ) . unwrap ( ) . entry ( domain. clone ( ) ) . or_insert ( Arc :: new ( data) ) . clone ( )
196+ }
197+
198+ #[ cfg( feature = "performance" ) ]
199+ fn get ( & self , domain : & String ) -> Option < Ref < String , DomainSpecificData > > {
200+ self . map . get ( domain)
201+ }
202+
203+ #[ cfg( feature = "performance" ) ]
204+ fn entry_or_insert ( & self , domain : & String , data : DomainSpecificData ) -> Ref < String , DomainSpecificData > {
205+ self . map . entry ( domain. clone ( ) ) . or_insert ( data) . downgrade ( )
206+ }
207+ }
208+
209+ fn domains ( ) -> & ' static DomainsMap {
210+ static DOMAINS : OnceLock < DomainsMap > = OnceLock :: new ( ) ;
170211
171- DOMAINS . get_or_init ( || dashmap :: DashMap :: new ( ) )
212+ DOMAINS . get_or_init ( || DomainsMap :: default ( ) )
172213}
173214
174215/// A macro to obtain localized messages and optionally their attributes, and check the `message_id`, `attribute_id`
@@ -421,7 +462,7 @@ pub fn fl(input: TokenStream) -> TokenStream {
421462 _assets : assets,
422463 } ;
423464
424- domains ( ) . entry ( domain. clone ( ) ) . or_insert ( data) . downgrade ( )
465+ domains ( ) . entry_or_insert ( & domain, data)
425466 } ;
426467
427468 let message_id_string = match & message_id {
0 commit comments