Skip to content

Commit 0a1cf2f

Browse files
---
yaml --- r: 102386 b: refs/heads/master c: 1938e87 h: refs/heads/master v: v3
1 parent 7f04bda commit 0a1cf2f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+779
-966
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 2fba2fea121b616793287f33aa3ee05e8d8893b0
2+
refs/heads/master: 1938e87393929ab33928210d55bff4bc2d73f6c2
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 6e7f170fedd3c526a643c0b2d13863acd982be02
55
refs/heads/try: a97642026c18a624ff6ea01075dd9550f8ed07ff

trunk/man/rustc.1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.TH RUSTC "1" "March 2014" "rustc 0.10-pre" "User Commands"
1+
.TH RUSTC "1" "July 2013" "rustc 0.7" "User Commands"
22
.SH NAME
33
rustc \- rust compiler
44
.SH SYNOPSIS

trunk/man/rustdoc.1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.TH RUSTDOC "1" "March 2014" "rustdoc 0.10-pre" "User Commands"
1+
.TH RUSTDOC "1" "July 2013" "rustdoc 0.7" "User Commands"
22
.SH NAME
33
rustdoc \- generate documentation from Rust source code
44
.SH SYNOPSIS

trunk/src/libextra/stats.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#[allow(missing_doc)];
1212

13+
use std::cmp;
1314
use std::hash::Hash;
1415
use std::io;
1516
use std::mem;
@@ -202,12 +203,12 @@ impl<'a> Stats for &'a [f64] {
202203

203204
fn min(self) -> f64 {
204205
assert!(self.len() != 0);
205-
self.iter().fold(self[0], |p, q| p.min(*q))
206+
self.iter().fold(self[0], |p,q| cmp::min(p, *q))
206207
}
207208

208209
fn max(self) -> f64 {
209210
assert!(self.len() != 0);
210-
self.iter().fold(self[0], |p, q| p.max(*q))
211+
self.iter().fold(self[0], |p,q| cmp::max(p, *q))
211212
}
212213

213214
fn mean(self) -> f64 {
@@ -441,7 +442,6 @@ mod tests {
441442
use stats::write_boxplot;
442443
use std::io;
443444
use std::str;
444-
use std::f64;
445445

446446
macro_rules! assert_approx_eq(
447447
($a:expr, $b:expr) => ({
@@ -481,14 +481,6 @@ mod tests {
481481
assert_eq!(summ.iqr, summ2.iqr);
482482
}
483483

484-
#[test]
485-
fn test_min_max_nan() {
486-
let xs = &[1.0, 2.0, f64::NAN, 3.0, 4.0];
487-
let summary = Summary::new(xs);
488-
assert_eq!(summary.min, 1.0);
489-
assert_eq!(summary.max, 4.0);
490-
}
491-
492484
#[test]
493485
fn test_norm2() {
494486
let val = &[

trunk/src/libstd/rt/bookkeeping.rs renamed to trunk/src/libnative/bookkeeping.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,16 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
//! Task bookkeeping
11+
//! 1:1 Task bookkeeping
1212
//!
13-
//! This module keeps track of the number of running tasks so that entry points
14-
//! with libnative know when it's possible to exit the program (once all tasks
15-
//! have exited).
13+
//! This module keeps track of the number of running 1:1 tasks so that entry
14+
//! points with libnative know when it's possible to exit the program (once all
15+
//! tasks have exited).
1616
//!
17-
//! The green counterpart for this is bookkeeping on sched pools, and it's up to
18-
//! each respective runtime to make sure that they call increment() and
19-
//! decrement() manually.
17+
//! The green counterpart for this is bookkeeping on sched pools.
2018
21-
#[experimental]; // this is a massive code smell
22-
#[doc(hidden)];
23-
24-
use sync::atomics;
25-
use unstable::mutex::{StaticNativeMutex, NATIVE_MUTEX_INIT};
19+
use std::sync::atomics;
20+
use std::unstable::mutex::{StaticNativeMutex, NATIVE_MUTEX_INIT};
2621

2722
static mut TASK_COUNT: atomics::AtomicUint = atomics::INIT_ATOMIC_UINT;
2823
static mut TASK_LOCK: StaticNativeMutex = NATIVE_MUTEX_INIT;
@@ -44,9 +39,12 @@ pub fn decrement() {
4439
/// the entry points of native programs
4540
pub fn wait_for_other_tasks() {
4641
unsafe {
47-
let mut guard = TASK_LOCK.lock();
48-
while TASK_COUNT.load(atomics::SeqCst) > 0 {
49-
guard.wait();
42+
{
43+
let mut guard = TASK_LOCK.lock();
44+
while TASK_COUNT.load(atomics::SeqCst) > 0 {
45+
guard.wait();
46+
}
5047
}
48+
TASK_LOCK.destroy();
5149
}
5250
}

trunk/src/libnative/io/file_unix.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use std::libc;
1919
use std::mem;
2020
use std::rt::rtio;
2121
use std::vec;
22-
use std::vec_ng::Vec;
2322

2423
use io::{IoResult, retry, keep_going};
2524

@@ -342,7 +341,7 @@ pub fn mkdir(p: &CString, mode: io::FilePermission) -> IoResult<()> {
342341

343342
pub fn readdir(p: &CString) -> IoResult<~[Path]> {
344343
use std::libc::{dirent_t};
345-
use std::libc::{opendir, readdir_r, closedir};
344+
use std::libc::{opendir, readdir, closedir};
346345

347346
fn prune(root: &CString, dirs: ~[Path]) -> ~[Path] {
348347
let root = unsafe { CString::new(root.with_ref(|p| p), false) };
@@ -354,28 +353,23 @@ pub fn readdir(p: &CString) -> IoResult<~[Path]> {
354353
}
355354

356355
extern {
357-
fn rust_dirent_t_size() -> libc::c_int;
358-
fn rust_list_dir_val(ptr: *mut dirent_t) -> *libc::c_char;
356+
fn rust_list_dir_val(ptr: *dirent_t) -> *libc::c_char;
359357
}
360358

361-
let size = unsafe { rust_dirent_t_size() };
362-
let mut buf = Vec::<u8>::with_capacity(size as uint);
363-
let ptr = buf.as_mut_slice().as_mut_ptr() as *mut dirent_t;
364-
365359
debug!("os::list_dir -- BEFORE OPENDIR");
366360

367361
let dir_ptr = p.with_ref(|buf| unsafe { opendir(buf) });
368362

369363
if dir_ptr as uint != 0 {
370364
let mut paths = ~[];
371365
debug!("os::list_dir -- opendir() SUCCESS");
372-
let mut entry_ptr = 0 as *mut dirent_t;
373-
while unsafe { readdir_r(dir_ptr, ptr, &mut entry_ptr) == 0 } {
374-
if entry_ptr.is_null() { break }
366+
let mut entry_ptr = unsafe { readdir(dir_ptr) };
367+
while entry_ptr as uint != 0 {
375368
let cstr = unsafe {
376369
CString::new(rust_list_dir_val(entry_ptr), false)
377370
};
378371
paths.push(Path::new(cstr));
372+
entry_ptr = unsafe { readdir(dir_ptr) };
379373
}
380374
assert_eq!(unsafe { closedir(dir_ptr) }, 0);
381375
Ok(prune(p, paths))

trunk/src/libnative/io/timer_helper.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
//! time.
2222
2323
use std::cast;
24-
use std::rt::bookkeeping;
2524
use std::rt;
2625
use std::unstable::mutex::{StaticNativeMutex, NATIVE_MUTEX_INIT};
2726

27+
use bookkeeping;
2828
use io::timer::{Req, Shutdown};
2929
use task;
3030

@@ -36,8 +36,6 @@ use task;
3636
static mut HELPER_CHAN: *mut Chan<Req> = 0 as *mut Chan<Req>;
3737
static mut HELPER_SIGNAL: imp::signal = 0 as imp::signal;
3838

39-
static mut TIMER_HELPER_EXIT: StaticNativeMutex = NATIVE_MUTEX_INIT;
40-
4139
pub fn boot(helper: fn(imp::signal, Port<Req>)) {
4240
static mut LOCK: StaticNativeMutex = NATIVE_MUTEX_INIT;
4341
static mut INITIALIZED: bool = false;
@@ -55,7 +53,6 @@ pub fn boot(helper: fn(imp::signal, Port<Req>)) {
5553
task::spawn(proc() {
5654
bookkeeping::decrement();
5755
helper(receive, msgp);
58-
TIMER_HELPER_EXIT.lock().signal()
5956
});
6057

6158
rt::at_exit(proc() { shutdown() });
@@ -73,15 +70,17 @@ pub fn send(req: Req) {
7370
}
7471

7572
fn shutdown() {
76-
// Request a shutdown, and then wait for the task to exit
77-
unsafe {
78-
let mut guard = TIMER_HELPER_EXIT.lock();
79-
send(Shutdown);
80-
guard.wait();
81-
drop(guard);
82-
TIMER_HELPER_EXIT.destroy();
83-
}
73+
// We want to wait for the entire helper task to exit, and in doing so it
74+
// will attempt to decrement the global task count. When the helper was
75+
// created, it decremented the count so it wouldn't count towards preventing
76+
// the program to exit, so here we pair that manual decrement with a manual
77+
// increment. We will then wait for the helper thread to exit by calling
78+
// wait_for_other_tasks.
79+
bookkeeping::increment();
8480

81+
// Request a shutdown, and then wait for the task to exit
82+
send(Shutdown);
83+
bookkeeping::wait_for_other_tasks();
8584

8685
// Clean up after ther helper thread
8786
unsafe {

trunk/src/libnative/io/timer_other.rs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -218,15 +218,8 @@ impl Timer {
218218
}
219219

220220
pub fn sleep(ms: u64) {
221-
let mut to_sleep = libc::timespec {
222-
tv_sec: (ms / 1000) as libc::time_t,
223-
tv_nsec: ((ms % 1000) * 1000000) as libc::c_long,
224-
};
225-
while unsafe { libc::nanosleep(&to_sleep, &mut to_sleep) } != 0 {
226-
if os::errno() as int != libc::EINTR as int {
227-
fail!("failed to sleep, but not because of EINTR?");
228-
}
229-
}
221+
// FIXME: this can fail because of EINTR, what do do?
222+
let _ = unsafe { libc::usleep((ms * 1000) as libc::c_uint) };
230223
}
231224

232225
fn inner(&mut self) -> ~Inner {

trunk/src/libnative/io/timer_timerfd.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
//! why).
2424
//!
2525
//! As with timer_other, timers just using sleep() do not use the timerfd at
26-
//! all. They remove the timerfd from the worker thread and then invoke
27-
//! nanosleep() to block the calling thread.
26+
//! all. They remove the timerfd from the worker thread and then invoke usleep()
27+
//! to block the calling thread.
2828
//!
2929
//! As with timer_other, all units in this file are in units of millseconds.
3030
@@ -183,15 +183,8 @@ impl Timer {
183183
}
184184

185185
pub fn sleep(ms: u64) {
186-
let mut to_sleep = libc::timespec {
187-
tv_sec: (ms / 1000) as libc::time_t,
188-
tv_nsec: ((ms % 1000) * 1000000) as libc::c_long,
189-
};
190-
while unsafe { libc::nanosleep(&to_sleep, &mut to_sleep) } != 0 {
191-
if os::errno() as int != libc::EINTR as int {
192-
fail!("failed to sleep, but not because of EINTR?");
193-
}
194-
}
186+
// FIXME: this can fail because of EINTR, what do do?
187+
let _ = unsafe { libc::usleep((ms * 1000) as libc::c_uint) };
195188
}
196189

197190
fn remove(&mut self) {

trunk/src/libnative/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
use std::os;
5959
use std::rt;
6060

61+
mod bookkeeping;
6162
pub mod io;
6263
pub mod task;
6364

@@ -104,5 +105,6 @@ pub fn start(argc: int, argv: **u8, main: proc()) -> int {
104105
/// number of arguments.
105106
pub fn run(main: proc()) -> int {
106107
main();
108+
bookkeeping::wait_for_other_tasks();
107109
os::get_exit_status()
108110
}

trunk/src/libnative/task.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@
1616
1717
use std::any::Any;
1818
use std::cast;
19-
use std::rt::bookkeeping;
2019
use std::rt::env;
2120
use std::rt::local::Local;
2221
use std::rt::rtio;
23-
use std::rt::stack;
2422
use std::rt::task::{Task, BlockedTask, SendMessage};
2523
use std::rt::thread::Thread;
2624
use std::rt;
2725
use std::task::TaskOpts;
2826
use std::unstable::mutex::NativeMutex;
27+
use std::rt::stack;
2928

3029
use io;
3130
use task;
31+
use bookkeeping;
3232

3333
/// Creates a new Task which is ready to execute as a 1:1 task.
3434
pub fn new(stack_bounds: (uint, uint)) -> ~Task {

trunk/src/librustc/back/link.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use back::archive::{Archive, METADATA_FILENAME};
1212
use back::rpath;
1313
use back::svh::Svh;
1414
use driver::driver::{CrateTranslation, OutputFilenames};
15-
use driver::session::Session;
15+
use driver::session::{NoDebugInfo, Session};
1616
use driver::session;
1717
use lib::llvm::llvm;
1818
use lib::llvm::ModuleRef;
@@ -92,7 +92,7 @@ pub mod write {
9292
use back::link::{OutputTypeExe, OutputTypeLlvmAssembly};
9393
use back::link::{OutputTypeObject};
9494
use driver::driver::{CrateTranslation, OutputFilenames};
95-
use driver::session::Session;
95+
use driver::session::{NoDebugInfo, Session};
9696
use driver::session;
9797
use lib::llvm::llvm;
9898
use lib::llvm::{ModuleRef, TargetMachineRef, PassManagerRef};
@@ -148,7 +148,7 @@ pub mod write {
148148

149149
// FIXME: #11906: Omitting frame pointers breaks retrieving the value of a parameter.
150150
// FIXME: #11954: mac64 unwinding may not work with fp elim
151-
let no_fp_elim = sess.opts.debuginfo ||
151+
let no_fp_elim = (sess.opts.debuginfo != NoDebugInfo) ||
152152
(sess.targ_cfg.os == abi::OsMacos &&
153153
sess.targ_cfg.arch == abi::X86_64);
154154

@@ -1052,7 +1052,7 @@ fn link_natively(sess: Session, dylib: bool, obj_filename: &Path,
10521052

10531053
// On OSX, debuggers need this utility to get run to do some munging of
10541054
// the symbols
1055-
if sess.targ_cfg.os == abi::OsMacos && sess.opts.debuginfo {
1055+
if sess.targ_cfg.os == abi::OsMacos && (sess.opts.debuginfo != NoDebugInfo) {
10561056
// FIXME (#9639): This needs to handle non-utf8 paths
10571057
match Process::status("dsymutil",
10581058
[out_filename.as_str().unwrap().to_owned()]) {

trunk/src/librustc/driver/driver.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
use back::link;
1313
use back::{arm, x86, x86_64, mips};
14-
use driver::session::{Aggressive, CrateTypeExecutable};
14+
use driver::session::{Aggressive, CrateTypeExecutable, FullDebugInfo, NoDebugInfo};
1515
use driver::session::{Session, Session_, No, Less, Default};
1616
use driver::session;
1717
use front;
@@ -865,7 +865,11 @@ pub fn build_session_options(matches: &getopts::Matches)
865865
} else { No }
866866
};
867867
let gc = debugging_opts & session::GC != 0;
868-
let debuginfo = matches.opt_present("g") || matches.opt_present("debuginfo");
868+
let debuginfo = if matches.opt_present("g") || matches.opt_present("debuginfo") {
869+
FullDebugInfo
870+
} else {
871+
NoDebugInfo
872+
};
869873

870874
let addl_lib_search_paths = matches.opt_strs("L").map(|s| {
871875
Path::new(s.as_slice())

trunk/src/librustc/driver/session.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,13 @@ pub enum OptLevel {
114114
Aggressive // -O3
115115
}
116116

117+
#[deriving(Clone, Eq)]
118+
pub enum DebugInfoLevel {
119+
NoDebugInfo,
120+
LimitedDebugInfo,
121+
FullDebugInfo,
122+
}
123+
117124
#[deriving(Clone)]
118125
pub struct Options {
119126
// The crate config requested for the session, which may be combined
@@ -122,7 +129,7 @@ pub struct Options {
122129

123130
gc: bool,
124131
optimize: OptLevel,
125-
debuginfo: bool,
132+
debuginfo: DebugInfoLevel,
126133
lint_opts: ~[(lint::Lint, lint::level)],
127134
output_types: ~[back::link::OutputType],
128135
// This was mutable for rustpkg, which updates search paths based on the
@@ -314,7 +321,7 @@ pub fn basic_options() -> @Options {
314321
crate_types: ~[],
315322
gc: false,
316323
optimize: No,
317-
debuginfo: false,
324+
debuginfo: NoDebugInfo,
318325
lint_opts: ~[],
319326
output_types: ~[],
320327
addl_lib_search_paths: @RefCell::new(HashSet::new()),

0 commit comments

Comments
 (0)