about summary refs log tree commit diff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorEric Holk <eholk@mozilla.com>2011-08-05 15:16:48 -0700
committerEric Holk <eholk@mozilla.com>2011-08-05 15:27:28 -0700
commitb62e80c1f022131da963da84ef6768f300c2c5c3 (patch)
tree5b975cd8fe1a872b9ac0bd0a9739d516588fa5ca /src/comp/middle
parent200bbcf91b4eb190cff227127cc60a333f9c33a2 (diff)
downloadrust-b62e80c1f022131da963da84ef6768f300c2c5c3.tar.gz
rust-b62e80c1f022131da963da84ef6768f300c2c5c3.zip
Atomic ref counting for chans.
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/trans.rs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 7e913c52839..be109921fc4 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1237,6 +1237,12 @@ fn make_copy_glue(cx: &@block_ctxt, v: ValueRef, t: &ty::t) {
         cx.build.Call(bcx_ccx(cx).upcalls.take_task,
                       ~[cx.fcx.lltaskptr, task_ptr]);
         bcx = cx;
+    } else if ty::type_is_chan(bcx_tcx(cx), t) {
+        let ptr = cx.build.Load(v);
+        ptr = cx.build.PointerCast(ptr, T_opaque_chan_ptr());
+        cx.build.Call(bcx_ccx(cx).upcalls.take_chan,
+                      ~[cx.fcx.lltaskptr, ptr]);
+        bcx = cx;
     } else if ty::type_is_boxed(bcx_tcx(cx), t) {
         bcx = incr_refcnt_of_boxed(cx, cx.build.Load(v)).bcx;
     } else if (ty::type_is_structural(bcx_tcx(cx), t)) {
@@ -1395,7 +1401,13 @@ fn make_drop_glue(cx: &@block_ctxt, v0: ValueRef, t: &ty::t) {
           }
           ty::ty_box(_) { decr_refcnt_maybe_free(cx, v0, v0, t) }
           ty::ty_port(_) { decr_refcnt_maybe_free(cx, v0, v0, t) }
-          ty::ty_chan(_) { decr_refcnt_maybe_free(cx, v0, v0, t) }
+          ty::ty_chan(_) {
+            let ptr = cx.build.Load(v0);
+            ptr = cx.build.PointerCast(ptr, T_opaque_chan_ptr());
+            {bcx: cx,
+             val: cx.build.Call(bcx_ccx(cx).upcalls.drop_chan,
+                                ~[cx.fcx.lltaskptr, ptr])}
+          }
           ty::ty_task. {
             let task_ptr = cx.build.Load(v0);
             {bcx: cx,