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:
parent
4981991a6e
commit
247a9398f4
3
Cargo.lock
generated
3
Cargo.lock
generated
@ -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)",
|
||||||
]
|
]
|
||||||
|
@ -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]
|
||||||
|
@ -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()),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user