Skip to content

Commit 7599d2d

Browse files
committed
rustdoc: Implement astsrv in a dedicated task
This allows the srv type to be sendable so we can parallelize all the rustdoc passes
1 parent 96e3031 commit 7599d2d

File tree

1 file changed

+55
-22
lines changed

1 file changed

+55
-22
lines changed

src/rustdoc/astsrv.rs

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import rustc::middle::resolve;
2121

2222
export ctxt;
2323
export ctxt_handler;
24-
export srv;
24+
export srv::{};
2525
export from_str;
2626
export from_file;
2727
export exec;
@@ -34,31 +34,71 @@ type ctxt = {
3434

3535
type srv_owner<T> = fn(srv: srv) -> T;
3636
type ctxt_handler<T> = fn~(ctxt: ctxt) -> T;
37+
type parser = fn~(session::session, str) -> @ast::crate;
3738

38-
type srv = {
39-
ctxt: ctxt
39+
enum msg {
40+
handle_request(fn~(ctxt)),
41+
exit
42+
}
43+
44+
enum srv = {
45+
ch: comm::chan<msg>
4046
};
4147

4248
fn from_str<T>(source: str, owner: srv_owner<T>) -> T {
43-
let (sess, ignore_errors) = build_session();
49+
run(owner, source, parse::from_str_sess)
50+
}
4451

45-
let srv = {
46-
ctxt: build_ctxt(sess, parse::from_str_sess(sess, source),
47-
ignore_errors)
48-
};
52+
fn from_file<T>(file: str, owner: srv_owner<T>) -> T {
53+
run(owner, file, parse::from_file_sess)
54+
}
55+
56+
fn run<T>(owner: srv_owner<T>, source: str, parse: parser) -> T {
57+
58+
let srv_ = srv({
59+
ch: task::spawn_listener {|po|
60+
act(po, source, parse);
61+
}
62+
});
4963

50-
owner(srv)
64+
let res = owner(srv_);
65+
comm::send(srv_.ch, exit);
66+
ret res;
5167
}
5268

53-
fn from_file<T>(file: str, owner: srv_owner<T>) -> T {
69+
fn act(po: comm::port<msg>, source: str, parse: parser) {
5470
let (sess, ignore_errors) = build_session();
5571

56-
let srv = {
57-
ctxt: build_ctxt(sess, parse::from_file_sess(sess, file),
58-
ignore_errors)
59-
};
72+
let ctxt = build_ctxt(
73+
sess,
74+
parse(sess, source),
75+
ignore_errors
76+
);
77+
78+
let keep_going = true;
79+
while keep_going {
80+
alt comm::recv(po) {
81+
handle_request(f) {
82+
f(ctxt);
83+
}
84+
exit {
85+
keep_going = false;
86+
}
87+
}
88+
}
89+
}
6090

61-
owner(srv)
91+
fn exec<T:send>(
92+
srv: srv,
93+
+f: fn~(ctxt: ctxt) -> T
94+
) -> T {
95+
let po = comm::port();
96+
let ch = comm::chan(po);
97+
let msg = handle_request(fn~[move f](ctxt: ctxt) {
98+
comm::send(ch, f(ctxt))
99+
});
100+
comm::send(srv.ch, msg);
101+
comm::recv(po)
62102
}
63103

64104
fn build_ctxt(sess: session::session, ast: @ast::crate,
@@ -242,13 +282,6 @@ fn should_ignore_external_import_paths_that_dont_exist() {
242282
from_str(source) {|_srv| }
243283
}
244284

245-
fn exec<T:send>(
246-
srv: srv,
247-
f: fn~(ctxt: ctxt) -> T
248-
) -> T {
249-
f(srv.ctxt)
250-
}
251-
252285
#[test]
253286
fn srv_should_return_request_result() {
254287
let source = "fn a() { }";

0 commit comments

Comments
 (0)