Skip to content

Commit cb8bd83

Browse files
committed
rustdoc: Run all work in a separate task
There's a good long comment explaining why. The tl;dr; is that I have no idea why this is necessary, but it gets --test to work on windows which is something, right? cc #13259 cc #16275 cc rust-lang/cargo#302
1 parent f5ac411 commit cb8bd83

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

src/librustdoc/lib.rs

+34-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,40 @@ local_data_key!(pub analysiskey: core::CrateAnalysis)
8989
type Output = (clean::Crate, Vec<plugins::PluginJson> );
9090

9191
pub fn main() {
92-
std::os::set_exit_status(main_args(std::os::args().as_slice()));
92+
// Why run rustdoc in a separate task? That's a good question!
93+
//
94+
// We first begin our adventure at the ancient commit of e7c4fb69. In this
95+
// commit it was discovered that the stack limit frobbing on windows ended
96+
// up causing some syscalls to fail. This was worked around manually in the
97+
// relevant location.
98+
//
99+
// Our journey now continues with #13259 where it was discovered that this
100+
// stack limit frobbing has the ability to affect nearly any syscall. Note
101+
// that the key idea here is that there is currently no knowledge as to why
102+
// this is happening or how to preserve it, fun times!
103+
//
104+
// Now we continue along to #16275 where it was discovered that --test on
105+
// windows didn't work at all! Yet curiously rustdoc worked without --test.
106+
// The exact reason that #16275 cropped up is that during the expansion
107+
// phase the compiler attempted to open libstd to read out its macros. This
108+
// invoked the LLVMRustOpenArchive shim which in turned went to LLVM to go
109+
// open a file and read it. Lo and behold this function returned an error!
110+
// It was then discovered that when the same fix mentioned in #13259 was
111+
// applied, the error went away. The plot thickens!
112+
//
113+
// Remember that rustdoc works without --test, which raises the question of
114+
// how because the --test and non --test paths are almost identical. The
115+
// first thing both paths do is parse and expand a crate! It turns out that
116+
// the difference is that --test runs on the *main task* while the normal
117+
// path runs in subtask. It turns out that running --test in a sub task also
118+
// fixes the problem!
119+
//
120+
// So, in summary, it is unknown why this is necessary, what it is
121+
// preventing, or what the actual bug is. In the meantime, this allows
122+
// --test to work on windows, which seems good, right? Fun times.
123+
spawn(proc() {
124+
std::os::set_exit_status(main_args(std::os::args().as_slice()));
125+
});
93126
}
94127

95128
pub fn opts() -> Vec<getopts::OptGroup> {

0 commit comments

Comments
 (0)