Skip to content

Commit b553e99

Browse files
authored
Merge pull request #31 from mischov/enhancement/dirty-scheduler
Use dirty scheduler instead of async
2 parents 2a93877 + b4b9486 commit b553e99

File tree

3 files changed

+50
-86
lines changed

3 files changed

+50
-86
lines changed

lib/meeseeks_html5ever.ex

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ defmodule MeeseeksHtml5ever do
99
Parses an HTML string into a `Meeseeks.Document`.
1010
"""
1111
def parse_html(html) do
12-
MeeseeksHtml5ever.Native.parse_html(html)
13-
14-
receive do
12+
case MeeseeksHtml5ever.Native.parse_html(html) do
1513
{:html5ever_nif_result, :ok, result} ->
1614
{:ok, result}
1715

@@ -24,9 +22,7 @@ defmodule MeeseeksHtml5ever do
2422
Parses an XML string into a `Meeseeks.Document`.
2523
"""
2624
def parse_xml(xml) do
27-
MeeseeksHtml5ever.Native.parse_xml(xml)
28-
29-
receive do
25+
case MeeseeksHtml5ever.Native.parse_xml(xml) do
3026
{:html5ever_nif_result, :ok, result} ->
3127
{:ok, result}
3228

native/meeseeks_html5ever_nif/Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,3 @@ html5ever = "0.22"
1515
xml5ever = "0.12"
1616
markup5ever = "0.7"
1717
tendril = "0.4"
18-
lazy_static = "1.2"
19-
scoped-pool = "1.0"

native/meeseeks_html5ever_nif/src/lib.rs

Lines changed: 48 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
#[macro_use]
22
extern crate rustler;
3-
#[macro_use]
4-
extern crate lazy_static;
53
extern crate html5ever;
64
extern crate xml5ever;
75
#[macro_use]
86
extern crate markup5ever;
9-
extern crate scoped_pool;
107
extern crate tendril;
118

129
use std::panic;
@@ -24,7 +21,7 @@ use rustler::{
2421
Term,
2522
};
2623

27-
use rustler::env::OwnedEnv;
24+
use rustler::schedule::SchedulerFlags;
2825
use rustler::types::binary::Binary;
2926

3027
use tendril::TendrilSink;
@@ -129,83 +126,53 @@ enum ParserType {
129126
XmlDocument,
130127
}
131128

132-
// Thread pool for `parse_async`.
133-
// TODO: How do we decide on pool size?
134-
lazy_static! {
135-
static ref POOL: scoped_pool::Pool = scoped_pool::Pool::new(4);
136-
}
137-
138129
fn parse<'a>(parser_type: ParserType, env: Env<'a>, args: &[Term<'a>]) -> NifResult<Term<'a>> {
139-
let mut owned_env = OwnedEnv::new();
140-
141-
// Copies the term into the inner env. Since this term is normally a large
142-
// binary term, copying it over should be cheap, since the binary will be
143-
// refcounted within the BEAM.
144-
let input_term = owned_env.save(args[0]);
145-
146-
let return_pid = env.pid();
147-
148-
//let config = term_to_configs(args[1]);
149-
150-
POOL.spawn(move || {
151-
owned_env.send_and_clear(&return_pid, |inner_env| {
152-
// This should not really be done in user code. We (Rustler project)
153-
// need to find a better abstraction that eliminates this.
154-
match panic::catch_unwind(|| {
155-
let binary: Binary = match input_term.load(inner_env).decode() {
156-
Ok(inner) => inner,
157-
Err(_) => panic!("argument is not a binary"),
158-
};
159-
160-
let sink = FlatDom::default();
161-
162-
let result = match parser_type {
163-
ParserType::HtmlDocument => {
164-
// TODO: Use Parser.from_bytes instead?
165-
let parser = html5ever::parse_document(sink, Default::default());
166-
167-
match std::str::from_utf8(binary.as_slice()) {
168-
Ok(decoded) => parser.one(decoded),
169-
Err(_) => panic!("input is not valid utf8"),
170-
}
171-
}
172-
173-
ParserType::XmlDocument => {
174-
// TODO: Use Parser.from_bytes instead?
175-
let parser = xml5ever::driver::parse_document(sink, Default::default());
176-
177-
match std::str::from_utf8(binary.as_slice()) {
178-
Ok(decoded) => parser.one(decoded),
179-
Err(_) => panic!("input is not valid utf8"),
180-
}
181-
182-
}
183-
};
184-
185-
let result_term = result.encode(inner_env);
186-
187-
//let result_term = handle_to_term(inner_env, &index, &Parent::None, &result.document);
188-
189-
(atoms::html5ever_nif_result(), atoms::ok(), result_term).encode(inner_env)
190-
}) {
191-
Ok(term) => term,
192-
Err(err) => {
193-
// Try to extract a panic reason and return that. If this
194-
// fails, fail generically.
195-
let reason = if let Some(s) = err.downcast_ref::<String>() {
196-
s.encode(inner_env)
197-
} else if let Some(&s) = err.downcast_ref::<&'static str>() {
198-
s.encode(inner_env)
199-
} else {
200-
atoms::nif_panic().encode(inner_env)
201-
};
202-
(atoms::html5ever_nif_result(), atoms::error(), reason).encode(inner_env)
130+
match panic::catch_unwind(|| {
131+
let binary: Binary = match args[0].decode() {
132+
Ok(inner) => inner,
133+
Err(_) => panic!("argument is not a binary"),
134+
};
135+
136+
let sink = FlatDom::default();
137+
138+
let result = match parser_type {
139+
ParserType::HtmlDocument => {
140+
let parser = html5ever::parse_document(sink, Default::default());
141+
142+
match std::str::from_utf8(binary.as_slice()) {
143+
Ok(decoded) => parser.one(decoded),
144+
Err(_) => panic!("input is not valid utf8"),
203145
}
204146
}
205-
});
206-
});
207147

208-
Ok(atoms::ok().encode(env))
148+
ParserType::XmlDocument => {
149+
let parser = xml5ever::driver::parse_document(sink, Default::default());
150+
151+
match std::str::from_utf8(binary.as_slice()) {
152+
Ok(decoded) => parser.one(decoded),
153+
Err(_) => panic!("input is not valid utf8"),
154+
}
155+
}
156+
};
157+
158+
let result_term = result.encode(env);
159+
160+
(atoms::html5ever_nif_result(), atoms::ok(), result_term).encode(env)
161+
}) {
162+
Ok(term) => Ok(term),
163+
Err(err) => {
164+
// Try to extract a panic reason and return that. If this
165+
// fails, fail generically.
166+
let reason = if let Some(s) = err.downcast_ref::<String>() {
167+
s.encode(env)
168+
} else if let Some(&s) = err.downcast_ref::<&'static str>() {
169+
s.encode(env)
170+
} else {
171+
atoms::nif_panic().encode(env)
172+
};
173+
Ok((atoms::html5ever_nif_result(), atoms::error(), reason).encode(env))
174+
}
175+
}
209176
}
210177

211178
fn parse_html<'a>(env: Env<'a>, args: &[Term<'a>]) -> NifResult<Term<'a>> {
@@ -218,7 +185,10 @@ fn parse_xml<'a>(env: Env<'a>, args: &[Term<'a>]) -> NifResult<Term<'a>> {
218185

219186
rustler_export_nifs!(
220187
"Elixir.MeeseeksHtml5ever.Native",
221-
[("parse_html", 1, parse_html), ("parse_xml", 1, parse_xml),],
188+
[
189+
("parse_html", 1, parse_html, SchedulerFlags::DirtyCpu),
190+
("parse_xml", 1, parse_xml, SchedulerFlags::DirtyCpu),
191+
],
222192
Some(on_load)
223193
);
224194

0 commit comments

Comments
 (0)