]> git.lizzy.rs Git - rust.git/commitdiff
isolate those funcs in task that can run on the c stack
authorNiko Matsakis <niko@alum.mit.edu>
Fri, 21 Oct 2011 20:31:51 +0000 (13:31 -0700)
committerBrian Anderson <banderson@mozilla.com>
Mon, 24 Oct 2011 23:06:17 +0000 (16:06 -0700)
src/lib/task.rs

index 3bafb5de76bd517e763618d4bc3f79769ecb83e9..09a914716e10b634fa88150d2eabacb26cff2d2d 100644 (file)
 export spawn_notify;
 export spawn_joinable;
 
-native "rust" mod rustrt {
-    fn task_sleep(time_in_us: uint);
-    fn task_yield();
-    fn task_join(t: task_id) -> int;
-    fn pin_task();
-    fn unpin_task();
-    fn get_task_id() -> task_id;
+native "rust" mod rustrt {                           // C Stack?
+    fn task_sleep(time_in_us: uint);                 // No
+    fn task_yield();                                 // No
+    fn start_task(id: task_id, closure: *u8);        // No
+    fn task_join(t: task_id) -> int;                 // Refactor
+}
 
-    type rust_chan;
+native "c-stack-cdecl" mod rustrt2 = "rustrt" {
+    fn pin_task();                                   // Yes
+    fn unpin_task();                                 // Yes
+    fn get_task_id() -> task_id;                     // Yes
 
-    fn set_min_stack(stack_size: uint);
+    fn set_min_stack(stack_size: uint);              // Yes
 
     fn new_task() -> task_id;
     fn drop_task(task: *rust_task);
     fn get_task_pointer(id: task_id) -> *rust_task;
 
-    fn migrate_alloc(alloc: *u8, target: task_id);
-    fn start_task(id: task_id, closure: *u8);
+    fn migrate_alloc(alloc: *u8, target: task_id);   // Yes
 }
 
 type rust_task =
      mutable notify_chan: comm::chan<task_notification>,
      mutable stack_ptr: *u8};
 
-resource rust_task_ptr(task: *rust_task) { rustrt::drop_task(task); }
+resource rust_task_ptr(task: *rust_task) { rustrt2::drop_task(task); }
 
 type task = int;
 type task_id = task;
 type joinable_task = (task_id, comm::port<task_notification>);
 
-fn get_task_id() -> task_id { rustrt::get_task_id() }
+fn get_task_id() -> task_id { rustrt2::get_task_id() }
 
 /**
  * Hints the scheduler to yield this task for a specified ammount of time.
@@ -86,11 +87,11 @@ fn join_id(t: task_id) -> task_result {
 
 fn unsupervise() { ret sys::unsupervise(); }
 
-fn pin() { rustrt::pin_task(); }
+fn pin() { rustrt2::pin_task(); }
 
-fn unpin() { rustrt::unpin_task(); }
+fn unpin() { rustrt2::unpin_task(); }
 
-fn set_min_stack(stack_size: uint) { rustrt::set_min_stack(stack_size); }
+fn set_min_stack(stack_size: uint) { rustrt2::set_min_stack(stack_size); }
 
 fn spawn<~T>(-data: T, f: fn(T)) -> task {
     spawn_inner2(data, f, none)
@@ -138,12 +139,12 @@ fn wrapper<~T>(-data: *u8, f: fn(T)) {
 fn unsafe_spawn_inner(-thunk: fn@(),
                       notify: option<comm::chan<task_notification>>) ->
    task_id unsafe {
-    let id = rustrt::new_task();
+    let id = rustrt2::new_task();
 
     let raw_thunk: {code: u32, env: u32} = cast(thunk);
 
     // set up the task pointer
-    let task_ptr <- rust_task_ptr(rustrt::get_task_pointer(id));
+    let task_ptr <- rust_task_ptr(rustrt2::get_task_pointer(id));
 
     assert (ptr::null() != (**task_ptr).stack_ptr);
 
@@ -167,7 +168,7 @@ fn unsafe_spawn_inner(-thunk: fn@(),
     }
 
     // give the thunk environment's allocation to the new task
-    rustrt::migrate_alloc(cast(raw_thunk.env), id);
+    rustrt2::migrate_alloc(cast(raw_thunk.env), id);
     rustrt::start_task(id, cast(thunkfn));
     // don't cleanup the thunk in this task
     unsafe::leak(thunk);