diff options
| author | toddaaro <github@opprobrio.us> | 2013-06-10 15:29:02 -0700 |
|---|---|---|
| committer | toddaaro <github@opprobrio.us> | 2013-06-10 15:29:02 -0700 |
| commit | d64d26cd39a86a40feb0db7a9147cc2ae5e82994 (patch) | |
| tree | 00cedc9e9b752fa99dfb552b73fa9359cd86b7ce /src/libstd/rt | |
| parent | d4de99aa6c53b0eb0d5be2ccfc62e2c89b2cd2df (diff) | |
| download | rust-d64d26cd39a86a40feb0db7a9147cc2ae5e82994.tar.gz rust-d64d26cd39a86a40feb0db7a9147cc2ae5e82994.zip | |
debugged a compiler ICE when merging local::borrow changes into the main io branch and modified the incoming new file lang.rs to be api-compatible
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/comm.rs | 4 | ||||
| -rw-r--r-- | src/libstd/rt/local.rs | 35 | ||||
| -rw-r--r-- | src/libstd/rt/mod.rs | 2 | ||||
| -rw-r--r-- | src/libstd/rt/sched.rs | 2 | ||||
| -rw-r--r-- | src/libstd/rt/task.rs | 4 | ||||
| -rw-r--r-- | src/libstd/rt/tube.rs | 2 | ||||
| -rw-r--r-- | src/libstd/rt/uv/uvio.rs | 2 |
7 files changed, 38 insertions, 13 deletions
diff --git a/src/libstd/rt/comm.rs b/src/libstd/rt/comm.rs index b00df78f433..88c7b9a2bf2 100644 --- a/src/libstd/rt/comm.rs +++ b/src/libstd/rt/comm.rs @@ -120,13 +120,13 @@ impl<T> ChanOne<T> { match oldstate { STATE_BOTH => { // Port is not waiting yet. Nothing to do - do Local::borrow::<Scheduler> |sched| { + do Local::borrow::<Scheduler, ()> |sched| { rtdebug!("non-rendezvous send"); sched.metrics.non_rendezvous_sends += 1; } } STATE_ONE => { - do Local::borrow::<Scheduler> |sched| { + do Local::borrow::<Scheduler, ()> |sched| { rtdebug!("rendezvous send"); sched.metrics.rendezvous_sends += 1; } diff --git a/src/libstd/rt/local.rs b/src/libstd/rt/local.rs index e6988c53888..359cf5fc3e1 100644 --- a/src/libstd/rt/local.rs +++ b/src/libstd/rt/local.rs @@ -18,7 +18,7 @@ pub trait Local { fn put(value: ~Self); fn take() -> ~Self; fn exists() -> bool; - fn borrow(f: &fn(&mut Self)); + fn borrow<T>(f: &fn(&mut Self) -> T) -> T; unsafe fn unsafe_borrow() -> *mut Self; unsafe fn try_unsafe_borrow() -> Option<*mut Self>; } @@ -27,7 +27,20 @@ impl Local for Scheduler { fn put(value: ~Scheduler) { unsafe { local_ptr::put(value) }} fn take() -> ~Scheduler { unsafe { local_ptr::take() } } fn exists() -> bool { local_ptr::exists() } - fn borrow(f: &fn(&mut Scheduler)) { unsafe { local_ptr::borrow(f) } } + fn borrow<T>(f: &fn(&mut Scheduler) -> T) -> T { + let mut res: Option<T> = None; + let res_ptr: *mut Option<T> = &mut res; + unsafe { + do local_ptr::borrow |sched| { + let result = f(sched); + *res_ptr = Some(result); + } + } + match res { + Some(r) => { r } + None => abort!("function failed!") + } + } unsafe fn unsafe_borrow() -> *mut Scheduler { local_ptr::unsafe_borrow() } unsafe fn try_unsafe_borrow() -> Option<*mut Scheduler> { abort!("unimpl") } } @@ -36,8 +49,8 @@ impl Local for Task { fn put(_value: ~Task) { abort!("unimpl") } fn take() -> ~Task { abort!("unimpl") } fn exists() -> bool { abort!("unimpl") } - fn borrow(f: &fn(&mut Task)) { - do Local::borrow::<Scheduler> |sched| { + fn borrow<T>(f: &fn(&mut Task) -> T) -> T { + do Local::borrow::<Scheduler, T> |sched| { match sched.current_task { Some(~ref mut task) => { f(&mut *task.task) @@ -74,7 +87,7 @@ impl Local for IoFactoryObject { fn put(_value: ~IoFactoryObject) { abort!("unimpl") } fn take() -> ~IoFactoryObject { abort!("unimpl") } fn exists() -> bool { abort!("unimpl") } - fn borrow(_f: &fn(&mut IoFactoryObject)) { abort!("unimpl") } + fn borrow<T>(_f: &fn(&mut IoFactoryObject) -> T) -> T { abort!("unimpl") } unsafe fn unsafe_borrow() -> *mut IoFactoryObject { let sched = Local::unsafe_borrow::<Scheduler>(); let io: *mut IoFactoryObject = (*sched).event_loop.io().unwrap(); @@ -115,4 +128,16 @@ mod test { } let _scheduler: ~Scheduler = Local::take(); } + + #[test] + fn borrow_with_return() { + let scheduler = ~new_test_uv_sched(); + Local::put(scheduler); + let res = do Local::borrow::<Scheduler,bool> |_sched| { + true + }; + assert!(res) + let _scheduler: ~Scheduler = Local::take(); + } + } diff --git a/src/libstd/rt/mod.rs b/src/libstd/rt/mod.rs index caf3e15e535..3198b285876 100644 --- a/src/libstd/rt/mod.rs +++ b/src/libstd/rt/mod.rs @@ -208,7 +208,7 @@ pub fn context() -> RuntimeContext { } else { if Local::exists::<Scheduler>() { let context = ::cell::empty_cell(); - do Local::borrow::<Scheduler> |sched| { + do Local::borrow::<Scheduler, ()> |sched| { if sched.in_task_context() { context.put_back(TaskContext); } else { diff --git a/src/libstd/rt/sched.rs b/src/libstd/rt/sched.rs index df231f6d88a..d149ff6d773 100644 --- a/src/libstd/rt/sched.rs +++ b/src/libstd/rt/sched.rs @@ -683,7 +683,7 @@ mod test { assert_eq!(count, MAX); fn run_task(count_ptr: *mut int) { - do Local::borrow::<Scheduler> |sched| { + do Local::borrow::<Scheduler, ()> |sched| { let task = ~do Coroutine::new(&mut sched.stack_pool) { unsafe { *count_ptr = *count_ptr + 1; diff --git a/src/libstd/rt/task.rs b/src/libstd/rt/task.rs index cf4967b12b3..4d9851d3b40 100644 --- a/src/libstd/rt/task.rs +++ b/src/libstd/rt/task.rs @@ -62,7 +62,7 @@ impl Task { pub fn run(&mut self, f: &fn()) { // This is just an assertion that `run` was called unsafely // and this instance of Task is still accessible. - do Local::borrow::<Task> |task| { + do Local::borrow::<Task, ()> |task| { assert!(ptr::ref_eq(task, self)); } @@ -87,7 +87,7 @@ impl Task { fn destroy(&mut self) { // This is just an assertion that `destroy` was called unsafely // and this instance of Task is still accessible. - do Local::borrow::<Task> |task| { + do Local::borrow::<Task, ()> |task| { assert!(ptr::ref_eq(task, self)); } match self.storage { diff --git a/src/libstd/rt/tube.rs b/src/libstd/rt/tube.rs index 4482a92d916..c94b0bd6423 100644 --- a/src/libstd/rt/tube.rs +++ b/src/libstd/rt/tube.rs @@ -155,7 +155,7 @@ mod test { if i == 100 { return; } let tube = Cell(Cell(tube)); - do Local::borrow::<Scheduler> |sched| { + do Local::borrow::<Scheduler, ()> |sched| { let tube = tube.take(); do sched.event_loop.callback { let mut tube = tube.take(); diff --git a/src/libstd/rt/uv/uvio.rs b/src/libstd/rt/uv/uvio.rs index 0f98ab11513..ebeb1c20451 100644 --- a/src/libstd/rt/uv/uvio.rs +++ b/src/libstd/rt/uv/uvio.rs @@ -167,7 +167,7 @@ mod test_remote { let mut tube = Tube::new(); let tube_clone = tube.clone(); let remote_cell = cell::empty_cell(); - do Local::borrow::<Scheduler>() |sched| { + do Local::borrow::<Scheduler, ()>() |sched| { let tube_clone = tube_clone.clone(); let tube_clone_cell = Cell(tube_clone); let remote = do sched.event_loop.remote_callback { |
