about summary refs log tree commit diff
path: root/src/libstd/rt/task.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-06-22 01:09:06 -0700
committerBrian Anderson <banderson@mozilla.com>2013-06-24 17:07:03 -0700
commit5e7c5d6c3d532e7b536b76044cd47b72b8eadaad (patch)
tree4293df31a4276cc3d477ece661fe30debc7da63a /src/libstd/rt/task.rs
parenta09972db3545344048b90e90d1f1821b621a38b9 (diff)
downloadrust-5e7c5d6c3d532e7b536b76044cd47b72b8eadaad.tar.gz
rust-5e7c5d6c3d532e7b536b76044cd47b72b8eadaad.zip
std: Make box annihilator work with newsched
Diffstat (limited to 'src/libstd/rt/task.rs')
-rw-r--r--src/libstd/rt/task.rs21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/libstd/rt/task.rs b/src/libstd/rt/task.rs
index 833f25b253c..68f7eb659b0 100644
--- a/src/libstd/rt/task.rs
+++ b/src/libstd/rt/task.rs
@@ -15,6 +15,7 @@
 
 use borrow;
 use cast::transmute;
+use cleanup;
 use libc::{c_void, uintptr_t};
 use ptr;
 use prelude::*;
@@ -118,6 +119,10 @@ impl Task {
             }
             _ => ()
         }
+
+        // Destroy remaining boxes
+        unsafe { cleanup::annihilate(); }
+
         self.destroyed = true;
     }
 }
@@ -269,4 +274,20 @@ mod test {
             assert!(res.is_err());
         }
     }
+
+    #[test]
+    fn heap_cycles() {
+        use option::{Option, Some, None};
+
+        do run_in_newsched_task {
+            struct List {
+                next: Option<@mut List>,
+            }
+
+            let a = @mut List { next: None };
+            let b = @mut List { next: Some(a) };
+
+            a.next = Some(b);
+        }
+    }
 }