aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-06-25 23:57:30 -0700
committerGraydon Hoare <[email protected]>2010-06-25 23:57:30 -0700
commit7ea416f4c33631d76fd5b12830c0d326803061c1 (patch)
tree20639257bfd83ca3f6355de01958fc8cee786237 /src
parentFurther attempts to convince mem_ctrl to be sane. (diff)
downloadrust-7ea416f4c33631d76fd5b12830c0d326803061c1.tar.xz
rust-7ea416f4c33631d76fd5b12830c0d326803061c1.zip
Add callable gc method exposed to user code, use it in mlist-cycle.rs test (still not quite working; some memory corruption in the recursive tag constructors, not the GC)
Diffstat (limited to 'src')
-rw-r--r--src/lib/sys.rs1
-rw-r--r--src/rt/rust_builtin.cpp5
-rw-r--r--src/test/run-pass/mlist-cycle.rs4
3 files changed, 10 insertions, 0 deletions
diff --git a/src/lib/sys.rs b/src/lib/sys.rs
index 84da28f7..3d858413 100644
--- a/src/lib/sys.rs
+++ b/src/lib/sys.rs
@@ -3,5 +3,6 @@ native "rust" mod rustrt {
fn size_of[T]() -> uint;
fn align_of[T]() -> uint;
fn refcount[T](@T t) -> uint;
+ fn gc();
}
diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp
index 71aa644b..eb84355f 100644
--- a/src/rt/rust_builtin.cpp
+++ b/src/rt/rust_builtin.cpp
@@ -81,6 +81,11 @@ refcount(rust_task *task, type_desc *t, size_t *v) {
return (*v) - 1;
}
+extern "C" CDECL void
+gc(rust_task *task) {
+ task->gc(1);
+}
+
extern "C" CDECL rust_vec*
vec_alloc(rust_task *task, type_desc *t, size_t n_elts)
{
diff --git a/src/test/run-pass/mlist-cycle.rs b/src/test/run-pass/mlist-cycle.rs
index 2a371317..313455f8 100644
--- a/src/test/run-pass/mlist-cycle.rs
+++ b/src/test/run-pass/mlist-cycle.rs
@@ -1,5 +1,7 @@
// -*- rust -*-
+use std;
+
type cell = tup(mutable @list);
type list = tag(link(@cell), nil());
@@ -7,4 +9,6 @@ fn main() {
let @cell first = tup(@nil());
let @cell second = tup(@link(first));
first._0 = link(second);
+ std.sys.rustrt.gc();
+ let @cell third = tup(@nil());
}