2011-07-29 19:53:02 -05:00
|
|
|
import sys;
|
2011-08-01 16:57:17 -05:00
|
|
|
import ptr;
|
|
|
|
import unsafe;
|
2011-08-09 18:07:49 -05:00
|
|
|
import task;
|
|
|
|
import task::task_id;
|
2011-07-29 19:53:02 -05:00
|
|
|
|
|
|
|
export _chan;
|
|
|
|
export _port;
|
|
|
|
|
|
|
|
export mk_port;
|
2011-08-09 18:07:49 -05:00
|
|
|
export send;
|
2011-08-16 19:12:46 -05:00
|
|
|
export recv;
|
|
|
|
export chan;
|
|
|
|
export port;
|
2011-07-29 19:53:02 -05:00
|
|
|
|
|
|
|
native "rust" mod rustrt {
|
2011-08-01 16:57:17 -05:00
|
|
|
type void;
|
2011-07-29 19:53:02 -05:00
|
|
|
type rust_port;
|
|
|
|
|
2011-08-12 08:37:10 -05:00
|
|
|
fn chan_id_send<~T>(target_task : task_id, target_port : port_id,
|
2011-08-10 16:38:49 -05:00
|
|
|
data : -T);
|
2011-07-29 19:53:02 -05:00
|
|
|
|
|
|
|
fn new_port(unit_sz : uint) -> *rust_port;
|
|
|
|
fn del_port(po : *rust_port);
|
|
|
|
fn drop_port(po : *rust_port);
|
2011-08-09 18:07:49 -05:00
|
|
|
fn get_port_id(po : *rust_port) -> port_id;
|
2011-08-02 14:29:10 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
native "rust-intrinsic" mod rusti {
|
2011-08-12 08:37:10 -05:00
|
|
|
fn recv<~T>(port : *rustrt::rust_port) -> T;
|
2011-07-29 19:53:02 -05:00
|
|
|
}
|
|
|
|
|
2011-08-09 18:07:49 -05:00
|
|
|
type port_id = int;
|
|
|
|
|
2011-08-16 19:12:46 -05:00
|
|
|
type chan<~T> = {
|
2011-08-09 18:07:49 -05:00
|
|
|
task : task_id,
|
|
|
|
port : port_id
|
|
|
|
};
|
2011-08-16 19:12:46 -05:00
|
|
|
type _chan<~T> = chan<T>;
|
2011-08-09 18:07:49 -05:00
|
|
|
|
2011-07-29 19:53:02 -05:00
|
|
|
resource port_ptr(po: *rustrt::rust_port) {
|
|
|
|
rustrt::drop_port(po);
|
|
|
|
rustrt::del_port(po);
|
|
|
|
}
|
|
|
|
|
2011-08-16 19:12:46 -05:00
|
|
|
type port<~T> = @port_ptr;
|
|
|
|
|
|
|
|
obj port_obj<~T>(raw_port : port<T>) {
|
2011-08-12 08:37:10 -05:00
|
|
|
fn mk_chan() -> _chan<T> {
|
2011-08-16 19:12:46 -05:00
|
|
|
chan::<T>(raw_port)
|
2011-08-09 18:07:49 -05:00
|
|
|
}
|
|
|
|
|
2011-08-02 14:29:10 -05:00
|
|
|
fn recv() -> T {
|
2011-08-16 19:12:46 -05:00
|
|
|
recv(raw_port)
|
2011-07-29 20:52:16 -05:00
|
|
|
}
|
|
|
|
}
|
2011-08-16 19:12:46 -05:00
|
|
|
type _port<~T> = port_obj<T>;
|
2011-07-29 20:52:16 -05:00
|
|
|
|
2011-08-12 08:37:10 -05:00
|
|
|
fn mk_port<~T>() -> _port<T> {
|
2011-08-16 19:12:46 -05:00
|
|
|
ret port_obj::<T>(port::<T>());
|
2011-07-29 19:53:02 -05:00
|
|
|
}
|
2011-08-09 18:07:49 -05:00
|
|
|
|
2011-08-16 19:12:46 -05:00
|
|
|
fn send<~T>(ch : chan<T>, data : -T) {
|
2011-08-09 18:07:49 -05:00
|
|
|
rustrt::chan_id_send(ch.task, ch.port, data);
|
2011-08-10 16:38:49 -05:00
|
|
|
}
|
2011-08-16 19:12:46 -05:00
|
|
|
|
|
|
|
fn port<~T>() -> port<T> {
|
|
|
|
@port_ptr(rustrt::new_port(sys::size_of::<T>()))
|
|
|
|
}
|
|
|
|
|
|
|
|
fn recv<~T>(p : port<T>) -> T {
|
|
|
|
ret rusti::recv(**p)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn chan<~T>(p : port<T>) -> chan<T> {
|
|
|
|
{
|
|
|
|
task: task::get_task_id(),
|
|
|
|
port: rustrt::get_port_id(**p)
|
|
|
|
}
|
|
|
|
}
|