1
0
mirror of https://github.com/BurntSushi/ripgrep.git synced 2025-06-04 05:57:39 +02:00

Switch to thread_local crate in lieu of thread_local!.

This is to work around a bug where using a thread_local! was causing
a segfault on macos.

Fixes #164.
This commit is contained in:
Andrew Gallant 2016-10-11 18:23:49 -04:00
parent 4981991a6e
commit 247a9398f4
4 changed files with 22 additions and 21 deletions

3
Cargo.lock generated
View File

@ -1,6 +1,6 @@
[root] [root]
name = "ripgrep" name = "ripgrep"
version = "0.2.1" version = "0.2.2"
dependencies = [ dependencies = [
"deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)", "docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)",
@ -17,6 +17,7 @@ dependencies = [
"regex 0.1.77 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.1.77 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
"term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
"thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
"walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
] ]

View File

@ -38,6 +38,7 @@ num_cpus = "1"
regex = "0.1.77" regex = "0.1.77"
rustc-serialize = "0.3" rustc-serialize = "0.3"
term = "0.4" term = "0.4"
thread_local = "0.2.7"
walkdir = "0.1" walkdir = "0.1"
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]

View File

@ -27,9 +27,11 @@ use std::fmt;
use std::fs::File; use std::fs::File;
use std::io::{self, BufRead}; use std::io::{self, BufRead};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::Arc;
use globset::{self, Candidate, GlobBuilder, GlobSet, GlobSetBuilder}; use globset::{self, Candidate, GlobBuilder, GlobSet, GlobSetBuilder};
use regex; use regex;
use thread_local::ThreadLocal;
use pathutil::{is_file_name, strip_prefix}; use pathutil::{is_file_name, strip_prefix};
@ -87,6 +89,7 @@ pub struct Gitignore {
patterns: Vec<Pattern>, patterns: Vec<Pattern>,
num_ignores: u64, num_ignores: u64,
num_whitelist: u64, num_whitelist: u64,
matches: Arc<ThreadLocal<RefCell<Vec<usize>>>>,
} }
impl Gitignore { impl Gitignore {
@ -133,27 +136,21 @@ impl Gitignore {
/// Like matched, but takes a path that has already been stripped. /// Like matched, but takes a path that has already been stripped.
pub fn matched_stripped(&self, path: &Path, is_dir: bool) -> Match { pub fn matched_stripped(&self, path: &Path, is_dir: bool) -> Match {
thread_local! { let _matches = self.matches.get_default();
static MATCHES: RefCell<Vec<usize>> = { let mut matches = _matches.borrow_mut();
RefCell::new(vec![]) let candidate = Candidate::new(path);
self.set.matches_candidate_into(&candidate, &mut *matches);
for &i in matches.iter().rev() {
let pat = &self.patterns[i];
if !pat.only_dir || is_dir {
return if pat.whitelist {
Match::Whitelist(pat)
} else {
Match::Ignored(pat)
};
} }
}; }
MATCHES.with(|matches| { Match::None
let mut matches = matches.borrow_mut();
let candidate = Candidate::new(path);
self.set.matches_candidate_into(&candidate, &mut *matches);
for &i in matches.iter().rev() {
let pat = &self.patterns[i];
if !pat.only_dir || is_dir {
return if pat.whitelist {
Match::Whitelist(pat)
} else {
Match::Ignored(pat)
};
}
}
Match::None
})
} }
/// Returns the total number of ignore patterns. /// Returns the total number of ignore patterns.
@ -256,6 +253,7 @@ impl GitignoreBuilder {
patterns: self.patterns, patterns: self.patterns,
num_ignores: nignores as u64, num_ignores: nignores as u64,
num_whitelist: nwhitelist as u64, num_whitelist: nwhitelist as u64,
matches: Arc::new(ThreadLocal::default()),
}) })
} }

View File

@ -16,6 +16,7 @@ extern crate num_cpus;
extern crate regex; extern crate regex;
extern crate rustc_serialize; extern crate rustc_serialize;
extern crate term; extern crate term;
extern crate thread_local;
extern crate walkdir; extern crate walkdir;
#[cfg(windows)] #[cfg(windows)]
extern crate winapi; extern crate winapi;