about summary refs log tree commit diff
path: root/src/libstd/task
diff options
context:
space:
mode:
authorBen Blum <bblum@andrew.cmu.edu>2013-07-15 14:27:33 -0400
committerBen Blum <bblum@andrew.cmu.edu>2013-07-20 05:08:58 -0400
commit728edb5af6917956596bd19f4298137df97c44f3 (patch)
tree1b813106290eee0add373d252763b6fe83374738 /src/libstd/task
parent6d9184609a6edb54eb06f402dedcbc8f13da3d1a (diff)
downloadrust-728edb5af6917956596bd19f4298137df97c44f3.tar.gz
rust-728edb5af6917956596bd19f4298137df97c44f3.zip
(cleanup) impl TaskSet
Diffstat (limited to 'src/libstd/task')
-rw-r--r--src/libstd/task/spawn.rs78
1 files changed, 39 insertions, 39 deletions
diff --git a/src/libstd/task/spawn.rs b/src/libstd/task/spawn.rs
index 477d386afb6..aac4463888b 100644
--- a/src/libstd/task/spawn.rs
+++ b/src/libstd/task/spawn.rs
@@ -128,21 +128,27 @@ impl IterBytes for TaskHandle {
     }
 }
 
-type TaskSet = HashSet<TaskHandle>;
+struct TaskSet(HashSet<TaskHandle>);
 
-fn new_taskset() -> TaskSet {
-    HashSet::new()
-}
-fn taskset_insert(tasks: &mut TaskSet, task: TaskHandle) {
-    let didnt_overwrite = tasks.insert(task);
-    assert!(didnt_overwrite);
-}
-fn taskset_remove(tasks: &mut TaskSet, task: &TaskHandle) {
-    let was_present = tasks.remove(task);
-    assert!(was_present);
-}
-fn taskset_consume(tasks: TaskSet) -> HashSetConsumeIterator<TaskHandle> {
-    tasks.consume()
+impl TaskSet {
+    #[inline]
+    fn new() -> TaskSet {
+        TaskSet(HashSet::new())
+    }
+    #[inline]
+    fn insert(&mut self, task: TaskHandle) {
+        let didnt_overwrite = (**self).insert(task);
+        assert!(didnt_overwrite);
+    }
+    #[inline]
+    fn remove(&mut self, task: &TaskHandle) {
+        let was_present = (**self).remove(task);
+        assert!(was_present);
+    }
+    #[inline]
+    fn consume(self) -> HashSetConsumeIterator<TaskHandle> {
+        (*self).consume()
+    }
 }
 
 // One of these per group of linked-failure tasks.
@@ -413,36 +419,30 @@ fn AutoNotify(chan: Chan<TaskResult>) -> AutoNotify {
 
 fn enlist_in_taskgroup(state: TaskGroupInner, me: TaskHandle,
                            is_member: bool) -> bool {
-    let newstate = util::replace(&mut *state, None);
+    let me = Cell::new(me); // :(
     // If 'None', the group was failing. Can't enlist.
-    if newstate.is_some() {
-        let mut group = newstate.unwrap();
-        taskset_insert(if is_member {
+    do state.map_mut_default(false) |group| {
+        (if is_member {
             &mut group.members
         } else {
             &mut group.descendants
-        }, me);
-        *state = Some(group);
+        }).insert(me.take());
         true
-    } else {
-        false
     }
 }
 
 // NB: Runs in destructor/post-exit context. Can't 'fail'.
 fn leave_taskgroup(state: TaskGroupInner, me: &TaskHandle,
                        is_member: bool) {
-    let newstate = util::replace(&mut *state, None);
+    let me = Cell::new(me); // :(
     // If 'None', already failing and we've already gotten a kill signal.
-    if newstate.is_some() {
-        let mut group = newstate.unwrap();
-        taskset_remove(if is_member {
+    do state.map_mut |group| {
+        (if is_member {
             &mut group.members
         } else {
             &mut group.descendants
-        }, me);
-        *state = Some(group);
-    }
+        }).remove(me.take());
+    };
 }
 
 // NB: Runs in destructor/post-exit context. Can't 'fail'.
@@ -464,13 +464,13 @@ fn kill_taskgroup(state: TaskGroupInner, me: &TaskHandle, is_main: bool) {
         if newstate.is_some() {
             let TaskGroupData { members: members, descendants: descendants } =
                 newstate.unwrap();
-            for taskset_consume(members).advance() |sibling| {
+            for members.consume().advance |sibling| {
                 // Skip self - killing ourself won't do much good.
                 if &sibling != me {
                     RuntimeGlue::kill_task(sibling);
                 }
             }
-            do taskset_consume(descendants).advance() |child| {
+            for descendants.consume().advance |child| {
                 assert!(&child != me);
                 RuntimeGlue::kill_task(child);
             }
@@ -548,11 +548,11 @@ impl RuntimeGlue {
                     match g {
                         None => {
                             // Main task, doing first spawn ever. Lazily initialise here.
-                            let mut members = new_taskset();
-                            taskset_insert(&mut members, OldTask(me));
+                            let mut members = TaskSet::new();
+                            members.insert(OldTask(me));
                             let tasks = exclusive(Some(TaskGroupData {
                                 members: members,
-                                descendants: new_taskset(),
+                                descendants: TaskSet::new(),
                             }));
                             // Main task/group has no ancestors, no notifier, etc.
                             let group = @@mut TCB(tasks, AncestorList(None), true, None);
@@ -570,12 +570,12 @@ impl RuntimeGlue {
                 blk(match (*me).taskgroup {
                     None => {
                         // Main task, doing first spawn ever. Lazily initialize.
-                        let mut members = new_taskset();
+                        let mut members = TaskSet::new();
                         let my_handle = (*me).death.kill_handle.get_ref().clone();
-                        taskset_insert(&mut members, NewTask(my_handle));
+                        members.insert(NewTask(my_handle));
                         let tasks = exclusive(Some(TaskGroupData {
                             members: members,
-                            descendants: new_taskset(),
+                            descendants: TaskSet::new(),
                         }));
                         let group = TCB(tasks, AncestorList(None), true, None);
                         (*me).taskgroup = Some(group);
@@ -601,8 +601,8 @@ fn gen_child_taskgroup(linked: bool, supervised: bool)
         } else {
             // Child is in a separate group from spawner.
             let g = exclusive(Some(TaskGroupData {
-                members:     new_taskset(),
-                descendants: new_taskset(),
+                members:     TaskSet::new(),
+                descendants: TaskSet::new(),
             }));
             let a = if supervised {
                 let new_generation = incr_generation(&ancestors);