1
Fork 0

Convert os/priv/uv to new task_builder interface

This commit is contained in:
Ben Blum 2012-07-23 19:53:22 -04:00
parent c7a6a66e4b
commit e0e9e451e7
4 changed files with 17 additions and 24 deletions

View file

@ -24,6 +24,7 @@ import option::{some, none};
import getcwd = rustrt::rust_getcwd; import getcwd = rustrt::rust_getcwd;
import consts::*; import consts::*;
import task::task_builder;
export close, fclose, fsync_fd, waitpid; export close, fclose, fsync_fd, waitpid;
export env, getenv, setenv, fdopen, pipe; export env, getenv, setenv, fdopen, pipe;
@ -160,19 +161,14 @@ mod global_env {
fn get_global_env_chan() -> comm::chan<msg> { fn get_global_env_chan() -> comm::chan<msg> {
let global_ptr = rustrt::rust_global_env_chan_ptr(); let global_ptr = rustrt::rust_global_env_chan_ptr();
let builder_fn = || { let task_build_fn = || {
let builder = task::builder();
task::unsupervise(builder);
// FIXME (#2621): This would be a good place to use a very small // FIXME (#2621): This would be a good place to use a very small
// foreign stack // foreign stack
task::set_sched_mode(builder, task::single_threaded); task::task().sched_mode(task::single_threaded).unlinked()
builder
}; };
unsafe { unsafe {
priv::chan_from_global_ptr( priv::chan_from_global_ptr(
global_ptr, builder_fn, global_env_task) global_ptr, task_build_fn, global_env_task)
} }
} }

View file

@ -3,6 +3,7 @@
export chan_from_global_ptr, weaken_task; export chan_from_global_ptr, weaken_task;
import compare_and_swap = rustrt::rust_compare_and_swap_ptr; import compare_and_swap = rustrt::rust_compare_and_swap_ptr;
import task::task_builder;
type rust_port_id = uint; type rust_port_id = uint;
@ -23,7 +24,7 @@ type global_ptr = *libc::uintptr_t;
*/ */
unsafe fn chan_from_global_ptr<T: send>( unsafe fn chan_from_global_ptr<T: send>(
global: global_ptr, global: global_ptr,
builder: fn() -> task::builder, task_fn: fn() -> task::task_builder,
+f: fn~(comm::port<T>) +f: fn~(comm::port<T>)
) -> comm::chan<T> { ) -> comm::chan<T> {
@ -41,7 +42,7 @@ unsafe fn chan_from_global_ptr<T: send>(
let setup_po = comm::port(); let setup_po = comm::port();
let setup_ch = comm::chan(setup_po); let setup_ch = comm::chan(setup_po);
let setup_ch = do task::run_listener(builder()) |setup_po| { let setup_ch = do task_fn().spawn_listener |setup_po| {
let po = comm::port::<T>(); let po = comm::port::<T>();
let ch = comm::chan(po); let ch = comm::chan(po);
comm::send(setup_ch, ch); comm::send(setup_ch, ch);
@ -92,7 +93,7 @@ fn test_from_global_chan1() {
// Create the global channel, attached to a new task // Create the global channel, attached to a new task
let ch = unsafe { let ch = unsafe {
do chan_from_global_ptr(globchanp, task::builder) |po| { do chan_from_global_ptr(globchanp, task::task) |po| {
let ch = comm::recv(po); let ch = comm::recv(po);
comm::send(ch, true); comm::send(ch, true);
let ch = comm::recv(po); let ch = comm::recv(po);
@ -106,7 +107,7 @@ fn test_from_global_chan1() {
// This one just reuses the previous channel // This one just reuses the previous channel
let ch = unsafe { let ch = unsafe {
do chan_from_global_ptr(globchanp, task::builder) |po| { do chan_from_global_ptr(globchanp, task::task) |po| {
let ch = comm::recv(po); let ch = comm::recv(po);
comm::send(ch, false); comm::send(ch, false);
} }
@ -135,7 +136,7 @@ fn test_from_global_chan2() {
do task::spawn { do task::spawn {
let ch = unsafe { let ch = unsafe {
do chan_from_global_ptr( do chan_from_global_ptr(
globchanp, task::builder) |po| { globchanp, task::task) |po| {
for uint::range(0u, 10u) |_j| { for uint::range(0u, 10u) |_j| {
let ch = comm::recv(po); let ch = comm::recv(po);

View file

@ -8,6 +8,7 @@ import get_gl = get;
import iotask::{iotask, spawn_iotask}; import iotask::{iotask, spawn_iotask};
import priv::{chan_from_global_ptr, weaken_task}; import priv::{chan_from_global_ptr, weaken_task};
import comm::{port, chan, methods, select2, listen}; import comm::{port, chan, methods, select2, listen};
import task::task_builder;
import either::{left, right}; import either::{left, right};
extern mod rustrt { extern mod rustrt {
@ -39,10 +40,7 @@ fn get_monitor_task_gl() -> iotask unsafe {
monitor_loop_chan_ptr); monitor_loop_chan_ptr);
let builder_fn = || { let builder_fn = || {
let builder = task::builder(); task::task().sched_mode(task::single_threaded).unlinked()
task::unsupervise(builder);
task::set_sched_mode(builder, task::single_threaded);
builder
}; };
#debug("before priv::chan_from_global_ptr"); #debug("before priv::chan_from_global_ptr");
@ -86,8 +84,7 @@ fn get_monitor_task_gl() -> iotask unsafe {
} }
fn spawn_loop() -> iotask unsafe { fn spawn_loop() -> iotask unsafe {
let builder = task::builder(); let builder = do task::task().add_wrapper |task_body| {
do task::add_wrapper(builder) |task_body| {
fn~(move task_body) { fn~(move task_body) {
// The I/O loop task also needs to be weak so it doesn't keep // The I/O loop task also needs to be weak so it doesn't keep
// the runtime alive // the runtime alive
@ -102,7 +99,7 @@ fn spawn_loop() -> iotask unsafe {
#debug("global libuv task is leaving weakened state"); #debug("global libuv task is leaving weakened state");
} }
} }
} };
spawn_iotask(builder) spawn_iotask(builder)
} }

View file

@ -13,6 +13,7 @@ export exit;
import libc::c_void; import libc::c_void;
import ptr::addr_of; import ptr::addr_of;
import comm::{port, chan, methods, listen}; import comm::{port, chan, methods, listen};
import task::task_builder;
import ll = uv_ll; import ll = uv_ll;
/// Used to abstract-away direct interaction with a libuv loop. /// Used to abstract-away direct interaction with a libuv loop.
@ -23,13 +24,11 @@ enum iotask {
}) })
} }
fn spawn_iotask(-builder: task::builder) -> iotask { fn spawn_iotask(-task: task::task_builder) -> iotask {
task::set_sched_mode(builder, task::single_threaded);
do listen |iotask_ch| { do listen |iotask_ch| {
do task::run(copy(builder)) { do task.sched_mode(task::single_threaded).spawn {
#debug("entering libuv task"); #debug("entering libuv task");
run_loop(iotask_ch); run_loop(iotask_ch);
#debug("libuv task exiting"); #debug("libuv task exiting");