mirror of
				https://github.com/sharkdp/bat.git
				synced 2025-10-30 22:54:07 +00:00 
			
		
		
		
	Builtin glob matchers build offload, v2
This commit is contained in:
		| @@ -122,6 +122,10 @@ impl App { | |||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         let mut syntax_mapping = SyntaxMapping::new(); |         let mut syntax_mapping = SyntaxMapping::new(); | ||||||
|  |         // start building glob matchers for builtin mappings immediately | ||||||
|  |         // this is an appropriate approach because it's statistically likely that | ||||||
|  |         // all the custom mappings need to be checked | ||||||
|  |         syntax_mapping.start_offload_build_all(); | ||||||
|  |  | ||||||
|         if let Some(values) = self.matches.get_many::<String>("ignored-suffix") { |         if let Some(values) = self.matches.get_many::<String>("ignored-suffix") { | ||||||
|             for suffix in values { |             for suffix in values { | ||||||
|   | |||||||
| @@ -1,6 +1,14 @@ | |||||||
| use std::path::Path; | use std::{ | ||||||
|  |     path::Path, | ||||||
|  |     sync::{ | ||||||
|  |         atomic::{AtomicBool, Ordering}, | ||||||
|  |         Arc, | ||||||
|  |     }, | ||||||
|  |     thread, | ||||||
|  | }; | ||||||
|  |  | ||||||
| use globset::{Candidate, GlobBuilder, GlobMatcher}; | use globset::{Candidate, GlobBuilder, GlobMatcher}; | ||||||
|  | use once_cell::sync::Lazy; | ||||||
|  |  | ||||||
| use crate::error::Result; | use crate::error::Result; | ||||||
| use builtin::BUILTIN_MAPPINGS; | use builtin::BUILTIN_MAPPINGS; | ||||||
| @@ -44,7 +52,20 @@ pub struct SyntaxMapping<'a> { | |||||||
|     /// |     /// | ||||||
|     /// Rules in front have precedence. |     /// Rules in front have precedence. | ||||||
|     custom_mappings: Vec<(GlobMatcher, MappingTarget<'a>)>, |     custom_mappings: Vec<(GlobMatcher, MappingTarget<'a>)>, | ||||||
|  |  | ||||||
|     pub(crate) ignored_suffixes: IgnoredSuffixes<'a>, |     pub(crate) ignored_suffixes: IgnoredSuffixes<'a>, | ||||||
|  |  | ||||||
|  |     /// A flag to halt glob matcher building, which is offloaded to another thread. | ||||||
|  |     /// | ||||||
|  |     /// We have this so that we can signal the thread to halt early when appropriate. | ||||||
|  |     halt_glob_build: Arc<AtomicBool>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<'a> Drop for SyntaxMapping<'a> { | ||||||
|  |     fn drop(&mut self) { | ||||||
|  |         // signal the offload thread to halt early | ||||||
|  |         self.halt_glob_build.store(true, Ordering::Relaxed); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'a> SyntaxMapping<'a> { | impl<'a> SyntaxMapping<'a> { | ||||||
| @@ -52,6 +73,24 @@ impl<'a> SyntaxMapping<'a> { | |||||||
|         Default::default() |         Default::default() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// Start a thread to build the glob matchers for all builtin mappings. | ||||||
|  |     /// | ||||||
|  |     /// The use of this function while not necessary, is useful to speed up startup | ||||||
|  |     /// times by starting this work early in parallel. | ||||||
|  |     /// | ||||||
|  |     /// The thread halts if/when `halt_glob_build` is set to true. | ||||||
|  |     pub fn start_offload_build_all(&self) { | ||||||
|  |         let halt = Arc::clone(&self.halt_glob_build); | ||||||
|  |         thread::spawn(move || { | ||||||
|  |             for (matcher, _) in BUILTIN_MAPPINGS.iter() { | ||||||
|  |                 if halt.load(Ordering::Relaxed) { | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |                 Lazy::force(matcher); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pub fn insert(&mut self, from: &str, to: MappingTarget<'a>) -> Result<()> { |     pub fn insert(&mut self, from: &str, to: MappingTarget<'a>) -> Result<()> { | ||||||
|         let matcher = make_glob_matcher(from)?; |         let matcher = make_glob_matcher(from)?; | ||||||
|         self.custom_mappings.push((matcher, to)); |         self.custom_mappings.push((matcher, to)); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user