diff options
| author | Eric Holk <eholk@mozilla.com> | 2011-08-05 15:16:48 -0700 |
|---|---|---|
| committer | Eric Holk <eholk@mozilla.com> | 2011-08-05 15:27:28 -0700 |
| commit | b62e80c1f022131da963da84ef6768f300c2c5c3 (patch) | |
| tree | 5b975cd8fe1a872b9ac0bd0a9739d516588fa5ca /src/comp/middle | |
| parent | 200bbcf91b4eb190cff227127cc60a333f9c33a2 (diff) | |
| download | rust-b62e80c1f022131da963da84ef6768f300c2c5c3.tar.gz rust-b62e80c1f022131da963da84ef6768f300c2c5c3.zip | |
Atomic ref counting for chans.
Diffstat (limited to 'src/comp/middle')
| -rw-r--r-- | src/comp/middle/trans.rs | 14 |
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, |
