Skip to content

Commit 5d024dc

Browse files
authored
Merge pull request #434 from brave/code_structure_4
Code structure follow up #3.
2 parents 1ac5df6 + 4a6c2ed commit 5d024dc

File tree

11 files changed

+59
-194
lines changed

11 files changed

+59
-194
lines changed

Cargo.lock

-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ seahash = "3" # seahash 4 introduces a breaking hash algorithm change
3636
memchr = "2.4"
3737
base64 = "0.13"
3838
rmp-serde = "0.15"
39-
lifeguard = { version = "^ 0.6.1", optional = true }
4039
cssparser = { version = "0.29", optional = true }
4140
selectors = { version = "0.24", optional = true }
4241
serde_json = "1.0"
@@ -89,9 +88,8 @@ harness = false
8988
[features]
9089
# If disabling default features, consider explicitly re-enabling the
9190
# "embedded-domain-resolver" feature.
92-
default = ["embedded-domain-resolver", "full-regex-handling", "object-pooling", "unsync-regex-caching"]
91+
default = ["embedded-domain-resolver", "full-regex-handling", "unsync-regex-caching"]
9392
full-regex-handling = []
94-
object-pooling = ["lifeguard"] # disables `Send` and `Sync` on `Engine`.
9593
unsync-regex-caching = [] # disables `Send` and `Sync` on `Engine`.
9694
regex-debug-info = []
9795
css-validation = ["cssparser", "selectors"]

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ By default, `adblock-rust` ships with a built-in domain resolution implementatio
5252
`adblock-rust` uses uBlock Origin-compatible resources for scriptlet injection and redirect rules.
5353
The `resource-assembler` feature allows `adblock-rust` to parse these resources directly from the file formats used by the uBlock Origin repository.
5454

55-
#### Thread safety (`object-pooling`, `unsync-regex-caching`)
55+
#### Thread safety (`unsync-regex-caching`)
5656

57-
The `object-pooling` and `unsync-regex-caching` features enable optimizations for rule matching speed and the amount of memory used by the engine.
58-
These features can be disabled to make the engine `Send + Sync`, although it is recommended to only access the engine on a single thread to maintain optimal performance.
57+
The `unsync-regex-caching` feature enables optimizations for rule matching speed and the amount of memory used by the engine.
58+
This feature can be disabled to make the engine `Send + Sync`, although it is recommended to only access the engine on a single thread to maintain optimal performance.

src/blocker.rs

+21-159
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,11 @@ use std::ops::DerefMut;
88
use std::sync::Arc;
99
use thiserror::Error;
1010

11-
#[cfg(feature = "object-pooling")]
12-
use lifeguard::Pool;
13-
1411
use crate::filters::network::{NetworkFilter, NetworkFilterMaskHelper, NetworkMatchable};
1512
use crate::optimizer;
1613
use crate::regex_manager::{RegexManager, RegexManagerDiscardPolicy};
1714
use crate::request::Request;
1815
use crate::resources::ResourceStorage;
19-
use crate::utils;
2016
use crate::utils::{fast_hash, Hash};
2117

2218
/// Options used when constructing a [`Blocker`].
@@ -88,25 +84,6 @@ pub enum BlockerError {
8884
FilterExists,
8985
}
9086

91-
#[cfg(feature = "object-pooling")]
92-
pub(crate) struct TokenPool {
93-
pub pool: Pool<Vec<utils::Hash>>,
94-
}
95-
96-
#[cfg(feature = "object-pooling")]
97-
impl Default for TokenPool {
98-
fn default() -> TokenPool {
99-
TokenPool {
100-
pool: lifeguard::pool()
101-
.with(lifeguard::StartingSize(1))
102-
.with(lifeguard::Supplier(|| {
103-
Vec::with_capacity(utils::TOKENS_BUFFER_SIZE)
104-
}))
105-
.build(),
106-
}
107-
}
108-
}
109-
11087
// only check for tags in tagged and exception rule buckets,
11188
// pass empty set for the rest
11289
static NO_TAGS: Lazy<HashSet<String>> = Lazy::new(HashSet::new);
@@ -129,10 +106,6 @@ pub struct Blocker {
129106

130107
pub(crate) enable_optimizations: bool,
131108

132-
// Not serialized
133-
#[cfg(feature = "object-pooling")]
134-
pub(crate) pool: TokenPool,
135-
136109
// Not serialized
137110
#[cfg(feature = "unsync-regex-caching")]
138111
pub(crate) regex_manager: std::cell::RefCell<RegexManager>,
@@ -167,24 +140,8 @@ impl Blocker {
167140

168141
pub fn check_generic_hide(&self, hostname_request: &Request) -> bool {
169142
let mut regex_manager = self.borrow_regex_manager();
170-
let mut request_tokens;
171-
#[cfg(feature = "object-pooling")]
172-
{
173-
request_tokens = self.pool.pool.new();
174-
}
175-
#[cfg(not(feature = "object-pooling"))]
176-
{
177-
request_tokens = Vec::with_capacity(utils::TOKENS_BUFFER_SIZE);
178-
}
179-
hostname_request.get_tokens(&mut request_tokens);
180-
181143
self.generic_hide
182-
.check(
183-
hostname_request,
184-
&request_tokens,
185-
&HashSet::new(),
186-
&mut regex_manager,
187-
)
144+
.check(hostname_request, &HashSet::new(), &mut regex_manager)
188145
.is_some()
189146
}
190147

@@ -200,70 +157,41 @@ impl Blocker {
200157
return BlockerResult::default();
201158
}
202159

203-
let mut request_tokens;
204-
#[cfg(feature = "object-pooling")]
205-
{
206-
request_tokens = self.pool.pool.new();
207-
}
208-
#[cfg(not(feature = "object-pooling"))]
209-
{
210-
request_tokens = Vec::with_capacity(utils::TOKENS_BUFFER_SIZE);
211-
}
212-
request.get_tokens(&mut request_tokens);
213-
214160
// Check the filters in the following order:
215161
// 1. $important (not subject to exceptions)
216162
// 2. redirection ($redirect=resource)
217163
// 3. normal filters - if no match by then
218164
// 4. exceptions - if any non-important match of forced
219165

220166
// Always check important filters
221-
let important_filter =
222-
self.importants
223-
.check(request, &request_tokens, &NO_TAGS, &mut regex_manager);
167+
let important_filter = self.importants.check(request, &NO_TAGS, &mut regex_manager);
224168

225169
// only check the rest of the rules if not previously matched
226170
let filter = if important_filter.is_none() && !matched_rule {
227171
self.filters_tagged
228-
.check(
229-
request,
230-
&request_tokens,
231-
&self.tags_enabled,
232-
&mut regex_manager,
233-
)
234-
.or_else(|| {
235-
self.filters
236-
.check(request, &request_tokens, &NO_TAGS, &mut regex_manager)
237-
})
172+
.check(request, &self.tags_enabled, &mut regex_manager)
173+
.or_else(|| self.filters.check(request, &NO_TAGS, &mut regex_manager))
238174
} else {
239175
important_filter
240176
};
241177

242178
let exception = match filter.as_ref() {
243179
// if no other rule matches, only check exceptions if forced to
244-
None if matched_rule || force_check_exceptions => self.exceptions.check(
245-
request,
246-
&request_tokens,
247-
&self.tags_enabled,
248-
&mut regex_manager,
249-
),
180+
None if matched_rule || force_check_exceptions => {
181+
self.exceptions
182+
.check(request, &self.tags_enabled, &mut regex_manager)
183+
}
250184
None => None,
251185
// If matched an important filter, exceptions don't atter
252186
Some(f) if f.is_important() => None,
253-
Some(_) => self.exceptions.check(
254-
request,
255-
&request_tokens,
256-
&self.tags_enabled,
257-
&mut regex_manager,
258-
),
187+
Some(_) => self
188+
.exceptions
189+
.check(request, &self.tags_enabled, &mut regex_manager),
259190
};
260191

261-
let redirect_filters = self.redirects.check_all(
262-
request,
263-
&request_tokens,
264-
&NO_TAGS,
265-
regex_manager.deref_mut(),
266-
);
192+
let redirect_filters =
193+
self.redirects
194+
.check_all(request, &NO_TAGS, regex_manager.deref_mut());
267195

268196
// Extract the highest priority redirect directive.
269197
// 1. Exceptions - can bail immediately if found
@@ -328,12 +256,7 @@ impl Blocker {
328256
let rewritten_url = if important {
329257
None
330258
} else {
331-
Self::apply_removeparam(
332-
&self.removeparam,
333-
request,
334-
&request_tokens,
335-
regex_manager.deref_mut(),
336-
)
259+
Self::apply_removeparam(&self.removeparam, request, regex_manager.deref_mut())
337260
};
338261

339262
// If something has already matched before but we don't know what, still return a match
@@ -351,7 +274,6 @@ impl Blocker {
351274
fn apply_removeparam(
352275
removeparam_filters: &NetworkFilterList,
353276
request: &Request,
354-
request_tokens: &[Hash],
355277
regex_manager: &mut RegexManager,
356278
) -> Option<String> {
357279
/// Represents an `&`-separated argument from a URL query parameter string
@@ -395,8 +317,7 @@ impl Blocker {
395317
.map(|param| (param, true))
396318
.collect();
397319

398-
let filters =
399-
removeparam_filters.check_all(request, request_tokens, &NO_TAGS, regex_manager);
320+
let filters = removeparam_filters.check_all(request, &NO_TAGS, regex_manager);
400321
let mut rewrite = false;
401322
for removeparam_filter in filters {
402323
if let Some(removeparam) = &removeparam_filter.modifier_option {
@@ -448,25 +369,10 @@ impl Blocker {
448369
return None;
449370
}
450371

451-
let mut request_tokens;
452372
let mut regex_manager = self.borrow_regex_manager();
453-
454-
#[cfg(feature = "object-pooling")]
455-
{
456-
request_tokens = self.pool.pool.new();
457-
}
458-
#[cfg(not(feature = "object-pooling"))]
459-
{
460-
request_tokens = Vec::with_capacity(utils::TOKENS_BUFFER_SIZE);
461-
}
462-
request.get_tokens(&mut request_tokens);
463-
464-
let filters = self.csp.check_all(
465-
request,
466-
&request_tokens,
467-
&self.tags_enabled,
468-
&mut regex_manager,
469-
);
373+
let filters = self
374+
.csp
375+
.check_all(request, &self.tags_enabled, &mut regex_manager);
470376

471377
if filters.is_empty() {
472378
return None;
@@ -597,9 +503,6 @@ impl Blocker {
597503
tagged_filters_all,
598504
// Options
599505
enable_optimizations: options.enable_optimizations,
600-
601-
#[cfg(feature = "object-pooling")]
602-
pool: TokenPool::default(),
603506
regex_manager: Default::default(),
604507
}
605508
}
@@ -888,34 +791,14 @@ impl NetworkFilterList {
888791
pub fn check(
889792
&self,
890793
request: &Request,
891-
request_tokens: &[Hash],
892794
active_tags: &HashSet<String>,
893795
regex_manager: &mut RegexManager,
894796
) -> Option<&NetworkFilter> {
895797
if self.filter_map.is_empty() {
896798
return None;
897799
}
898800

899-
if let Some(source_hostname_hashes) = request.source_hostname_hashes.as_ref() {
900-
for token in source_hostname_hashes {
901-
if let Some(filter_bucket) = self.filter_map.get(token) {
902-
for filter in filter_bucket {
903-
// if matched, also needs to be tagged with an active tag (or not tagged at all)
904-
if filter.matches(request, regex_manager)
905-
&& filter
906-
.tag
907-
.as_ref()
908-
.map(|t| active_tags.contains(t))
909-
.unwrap_or(true)
910-
{
911-
return Some(filter);
912-
}
913-
}
914-
}
915-
}
916-
}
917-
918-
for token in request_tokens {
801+
for token in request.get_tokens_for_match() {
919802
if let Some(filter_bucket) = self.filter_map.get(token) {
920803
for filter in filter_bucket {
921804
// if matched, also needs to be tagged with an active tag (or not tagged at all)
@@ -942,7 +825,6 @@ impl NetworkFilterList {
942825
pub fn check_all(
943826
&self,
944827
request: &Request,
945-
request_tokens: &[Hash],
946828
active_tags: &HashSet<String>,
947829
regex_manager: &mut RegexManager,
948830
) -> Vec<&NetworkFilter> {
@@ -952,26 +834,7 @@ impl NetworkFilterList {
952834
return filters;
953835
}
954836

955-
if let Some(source_hostname_hashes) = request.source_hostname_hashes.as_ref() {
956-
for token in source_hostname_hashes {
957-
if let Some(filter_bucket) = self.filter_map.get(token) {
958-
for filter in filter_bucket {
959-
// if matched, also needs to be tagged with an active tag (or not tagged at all)
960-
if filter.matches(request, regex_manager)
961-
&& filter
962-
.tag
963-
.as_ref()
964-
.map(|t| active_tags.contains(t))
965-
.unwrap_or(true)
966-
{
967-
filters.push(filter);
968-
}
969-
}
970-
}
971-
}
972-
}
973-
974-
for token in request_tokens {
837+
for token in request.get_tokens_for_match() {
975838
if let Some(filter_bucket) = self.filter_map.get(token) {
976839
for filter in filter_bucket {
977840
// if matched, also needs to be tagged with an active tag (or not tagged at all)
@@ -987,7 +850,6 @@ impl NetworkFilterList {
987850
}
988851
}
989852
}
990-
991853
filters
992854
}
993855
}

src/data_format/v0.rs

-3
Original file line numberDiff line numberDiff line change
@@ -494,9 +494,6 @@ impl From<DeserializeFormat> for (Blocker, CosmeticFilterCache) {
494494
tagged_filters_all: v.tagged_filters_all.into_iter().map(|f| f.into()).collect(),
495495

496496
enable_optimizations: v.enable_optimizations,
497-
498-
#[cfg(feature = "object-pooling")]
499-
pool: Default::default(),
500497
regex_manager: Default::default(),
501498
},
502499
CosmeticFilterCache {

src/engine.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ impl Engine {
273273
}
274274

275275
/// Static assertions for `Engine: Send + Sync` traits.
276-
#[cfg(not(any(feature = "object-pooling", feature = "unsync-regex-caching")))]
276+
#[cfg(not(feature = "unsync-regex-caching"))]
277277
fn _assertions() {
278278
fn _assert_send<T: Send>() {}
279279
fn _assert_sync<T: Sync>() {}

src/filters/network_matchers.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ where
134134
return true;
135135
}
136136
let request_url = request.get_url(mask.match_case());
137-
filters.any(|f| &request_url == f)
137+
filters.any(|f| request_url == f)
138138
}
139139

140140
// pattern*^

0 commit comments

Comments
 (0)