Move sys::refcount to managed::refcount

More progress on #2240
This commit is contained in:
Alex Crichton 2013-10-17 21:13:56 -07:00
parent d8d1b8f8be
commit 82f5f65076
4 changed files with 20 additions and 23 deletions

View File

@ -17,6 +17,13 @@ use ptr::to_unsafe_ptr;
pub static RC_MANAGED_UNIQUE : uint = (-2) as uint;
pub static RC_IMMORTAL : uint = 0x77777777;
/// Returns the refcount of a shared box (as just before calling this)
#[inline]
pub fn refcount<T>(t: @T) -> uint {
use unstable::raw::Repr;
unsafe { (*t.repr()).ref_count }
}
/// Determine if two shared boxes point to the same object
#[inline]
pub fn ptr_eq<T>(a: @T, b: @T) -> bool {

View File

@ -13,22 +13,12 @@
#[allow(missing_doc)];
use c_str::ToCStr;
use cast;
use libc::size_t;
use libc;
use repr;
use rt::task;
use str;
/// Returns the refcount of a shared box (as just before calling this)
#[inline]
pub fn refcount<T>(t: @T) -> uint {
unsafe {
let ref_ptr: *uint = cast::transmute_copy(&t);
*ref_ptr - 1
}
}
pub fn log_str<T>(t: &T) -> ~str {
use rt::io;
use rt::io::Decorator;

View File

@ -14,11 +14,11 @@
enum t { make_t(@int), clam, }
fn foo(s: @int) {
info2!("{:?}", ::std::sys::refcount(s));
let count = ::std::sys::refcount(s);
info2!("{:?}", ::std::managed::refcount(s));
let count = ::std::managed::refcount(s);
let x: t = make_t(s); // ref up
assert_eq!(::std::sys::refcount(s), count + 1u);
info2!("{:?}", ::std::sys::refcount(s));
assert_eq!(::std::managed::refcount(s), count + 1u);
info2!("{:?}", ::std::managed::refcount(s));
match x {
make_t(y) => {
@ -27,19 +27,19 @@ fn foo(s: @int) {
}
_ => { info2!("?"); fail2!(); }
}
info2!("{:?}", ::std::sys::refcount(s));
assert_eq!(::std::sys::refcount(s), count + 1u);
let _ = ::std::sys::refcount(s); // don't get bitten by last-use.
info2!("{:?}", ::std::managed::refcount(s));
assert_eq!(::std::managed::refcount(s), count + 1u);
let _ = ::std::managed::refcount(s); // don't get bitten by last-use.
}
pub fn main() {
let s: @int = @0; // ref up
let count = ::std::sys::refcount(s);
let count = ::std::managed::refcount(s);
foo(s); // ref up then down
info2!("{}", ::std::sys::refcount(s));
let count2 = ::std::sys::refcount(s);
info2!("{}", ::std::managed::refcount(s));
let count2 = ::std::managed::refcount(s);
assert_eq!(count, count2);
}

View File

@ -10,14 +10,14 @@
#[allow(unused_variable)];
use std::sys;
use std::managed;
pub fn main() {
let i = ~@1;
let j = ~@2;
let rc1 = sys::refcount(*i);
let rc1 = managed::refcount(*i);
let j = i.clone();
let rc2 = sys::refcount(*i);
let rc2 = managed::refcount(*i);
error2!("rc1: {} rc2: {}", rc1, rc2);
assert_eq!(rc1 + 1u, rc2);
}