2017-10-22 20:01:00 -07:00
|
|
|
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
|
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
|
//
|
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
|
// except according to those terms.
|
|
|
|
|
|
2018-04-03 14:36:57 +02:00
|
|
|
use boxed::FnBox;
|
2017-10-22 20:01:00 -07:00
|
|
|
use ffi::CStr;
|
|
|
|
|
use io;
|
|
|
|
|
use sys::{unsupported, Void};
|
|
|
|
|
use time::Duration;
|
|
|
|
|
|
|
|
|
|
pub struct Thread(Void);
|
|
|
|
|
|
|
|
|
|
pub const DEFAULT_MIN_STACK_SIZE: usize = 4096;
|
|
|
|
|
|
|
|
|
|
impl Thread {
|
2018-07-10 20:52:29 +02:00
|
|
|
pub unsafe fn new<'a>(_stack: usize, _p: Box<dyn FnBox() + 'a>)
|
2017-10-22 20:01:00 -07:00
|
|
|
-> io::Result<Thread>
|
|
|
|
|
{
|
|
|
|
|
unsupported()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn yield_now() {
|
|
|
|
|
// do nothing
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn set_name(_name: &CStr) {
|
|
|
|
|
// nope
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn sleep(_dur: Duration) {
|
|
|
|
|
panic!("can't sleep");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn join(self) {
|
|
|
|
|
match self.0 {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub mod guard {
|
Use a range to identify SIGSEGV in stack guards
Previously, the `guard::init()` and `guard::current()` functions were
returning a `usize` address representing the top of the stack guard,
respectively for the main thread and for spawned threads. The `SIGSEGV`
handler on `unix` targets checked if a fault was within one page below
that address, if so reporting it as a stack overflow.
Now `unix` targets report a `Range<usize>` representing the guard
memory, so it can cover arbitrary guard sizes. Non-`unix` targets which
always return `None` for guards now do so with `Option<!>`, so they
don't pay any overhead.
For `linux-gnu` in particular, the previous guard upper-bound was
`stackaddr + guardsize`, as the protected memory was *inside* the stack.
This was a glibc bug, and starting from 2.27 they are moving the guard
*past* the end of the stack. However, there's no simple way for us to
know where the guard page actually lies, so now we declare it as the
whole range of `stackaddr ± guardsize`, and any fault therein will be
called a stack overflow. This fixes #47863.
2018-01-31 11:41:29 -08:00
|
|
|
pub type Guard = !;
|
|
|
|
|
pub unsafe fn current() -> Option<Guard> { None }
|
|
|
|
|
pub unsafe fn init() -> Option<Guard> { None }
|
2018-03-24 13:47:36 +09:00
|
|
|
pub unsafe fn deinit() {}
|
2017-10-22 20:01:00 -07:00
|
|
|
}
|