diff options
| author | Eric Holk <eholk@mozilla.com> | 2011-08-16 17:12:46 -0700 |
|---|---|---|
| committer | Eric Holk <eholk@mozilla.com> | 2011-08-17 14:42:40 -0700 |
| commit | efac7c9a197fa3ff3497ce99a2dda8693b3ef683 (patch) | |
| tree | bd36f31921ed624c1cf63d6ee9418c2944981b58 /src | |
| parent | 72b2f8207d6b626bc2514b830ef4d91580f08637 (diff) | |
| download | rust-efac7c9a197fa3ff3497ce99a2dda8693b3ef683.tar.gz rust-efac7c9a197fa3ff3497ce99a2dda8693b3ef683.zip | |
Yet another comm interface.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/comm.rs | 42 | ||||
| -rw-r--r-- | src/rt/rustrt.def.in | 3 | ||||
| -rw-r--r-- | src/test/stdtest/comm.rs | 8 |
3 files changed, 36 insertions, 17 deletions
diff --git a/src/lib/comm.rs b/src/lib/comm.rs index 03b719cdc73..318d9782301 100644 --- a/src/lib/comm.rs +++ b/src/lib/comm.rs @@ -10,16 +10,14 @@ export _port; export mk_port; export chan_from_unsafe_ptr; export send; +export recv; +export chan; +export port; native "rust" mod rustrt { type void; - type rust_chan; type rust_port; - fn new_chan(po : *rust_port) -> *rust_chan; - fn take_chan(ch : *rust_chan); - fn drop_chan(ch : *rust_chan); - fn chan_send(ch: *rust_chan, v : *void); fn chan_id_send<~T>(target_task : task_id, target_port : port_id, data : -T); @@ -35,34 +33,50 @@ native "rust-intrinsic" mod rusti { type port_id = int; -type _chan<~T> = { +type chan<~T> = { task : task_id, port : port_id }; +type _chan<~T> = chan<T>; resource port_ptr(po: *rustrt::rust_port) { rustrt::drop_port(po); rustrt::del_port(po); } -obj _port<~T>(raw_port : @port_ptr) { +type port<~T> = @port_ptr; + +obj port_obj<~T>(raw_port : port<T>) { // FIXME: rename this to chan once chan is not a keyword. fn mk_chan() -> _chan<T> { - { - task: task::get_task_id(), - port: rustrt::get_port_id(**raw_port) - } + chan::<T>(raw_port) } fn recv() -> T { - ret rusti::recv(**raw_port) + recv(raw_port) } } +type _port<~T> = port_obj<T>; fn mk_port<~T>() -> _port<T> { - _port(@port_ptr(rustrt::new_port(sys::size_of::<T>()))) + ret port_obj::<T>(port::<T>()); } -fn send<~T>(ch : _chan<T>, data : -T) { +fn send<~T>(ch : chan<T>, data : -T) { rustrt::chan_id_send(ch.task, ch.port, data); } + +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) + } +} diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index 0d05d7ffa43..f29c35acdda 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -16,14 +16,12 @@ debug_box debug_fn debug_obj debug_opaque -del_chan del_port debug_ptrcast debug_tag debug_trap debug_tydesc do_gc -drop_chan drop_port drop_task get_port_id @@ -77,7 +75,6 @@ str_from_cstr str_from_ivec str_push_byte str_slice -take_chan task_sleep task_yield task_join diff --git a/src/test/stdtest/comm.rs b/src/test/stdtest/comm.rs index e0e310e5ee2..17c3bc1e929 100644 --- a/src/test/stdtest/comm.rs +++ b/src/test/stdtest/comm.rs @@ -17,3 +17,11 @@ fn send_recv() { log_err v; assert(42 == v); } + +#[test] +fn send_recv_fn() { + let p = comm::port::<int>(); + let c = comm::chan::<int>(p); + comm::send(c, 42); + assert(comm::recv(p) == 42); +} |
