about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEric Holk <eholk@mozilla.com>2011-08-16 17:12:46 -0700
committerEric Holk <eholk@mozilla.com>2011-08-17 14:42:40 -0700
commitefac7c9a197fa3ff3497ce99a2dda8693b3ef683 (patch)
treebd36f31921ed624c1cf63d6ee9418c2944981b58 /src
parent72b2f8207d6b626bc2514b830ef4d91580f08637 (diff)
downloadrust-efac7c9a197fa3ff3497ce99a2dda8693b3ef683.tar.gz
rust-efac7c9a197fa3ff3497ce99a2dda8693b3ef683.zip
Yet another comm interface.
Diffstat (limited to 'src')
-rw-r--r--src/lib/comm.rs42
-rw-r--r--src/rt/rustrt.def.in3
-rw-r--r--src/test/stdtest/comm.rs8
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);
+}