提交 4beda4e5 编写于 作者: B Brian Anderson

std::rt: Stop using unstable::global in change_dir_locked

上级 f8c4d99d
...@@ -869,26 +869,38 @@ fn chdir(p: &Path) -> bool { ...@@ -869,26 +869,38 @@ fn chdir(p: &Path) -> bool {
/// CWD to what it was before, returning true. /// CWD to what it was before, returning true.
/// Returns false if the directory doesn't exist or if the directory change /// Returns false if the directory doesn't exist or if the directory change
/// is otherwise unsuccessful. /// is otherwise unsuccessful.
/// FIXME #7870 This probably shouldn't be part of the public API
pub fn change_dir_locked(p: &Path, action: &fn()) -> bool { pub fn change_dir_locked(p: &Path, action: &fn()) -> bool {
use unstable::global::global_data_clone_create; use task;
use unstable::sync::{Exclusive, exclusive}; use unstable::finally::Finally;
fn key(_: Exclusive<()>) { }
unsafe { unsafe {
let result = global_data_clone_create(key, || { ~exclusive(()) }); // This is really sketchy. Using a pthread mutex so descheduling
// in the `action` callback can cause deadlock. Doing it in
do result.with_imm() |_| { // `task::atomically` to try to avoid that, but ... I don't know
let old_dir = os::getcwd(); // this is all bogus.
if change_dir(p) { return do task::atomically {
action(); rust_take_change_dir_lock();
change_dir(&old_dir)
} do (||{
else { let old_dir = os::getcwd();
false if change_dir(p) {
action();
change_dir(&old_dir)
}
else {
false
}
}).finally {
rust_drop_change_dir_lock();
} }
} }
} }
extern {
fn rust_take_change_dir_lock();
fn rust_drop_change_dir_lock();
}
} }
/// Copies a file from one location to another /// Copies a file from one location to another
......
...@@ -947,6 +947,18 @@ rust_get_exit_status_newrt() { ...@@ -947,6 +947,18 @@ rust_get_exit_status_newrt() {
return exit_status; return exit_status;
} }
static lock_and_signal change_dir_lock;
extern "C" CDECL void
rust_take_change_dir_lock() {
global_args_lock.lock();
}
extern "C" CDECL void
rust_drop_change_dir_lock() {
global_args_lock.unlock();
}
// //
// Local Variables: // Local Variables:
// mode: C++ // mode: C++
......
...@@ -268,3 +268,5 @@ rust_take_global_args_lock ...@@ -268,3 +268,5 @@ rust_take_global_args_lock
rust_drop_global_args_lock rust_drop_global_args_lock
rust_set_exit_status_newrt rust_set_exit_status_newrt
rust_get_exit_status_newrt rust_get_exit_status_newrt
rust_take_change_dir_lock
rust_drop_change_dir_lock
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册