160 let |
160 let |
161 val _ = cancel_group group Exn.Interrupt; |
161 val _ = cancel_group group Exn.Interrupt; |
162 val tasks = Inttab.lookup_list groups (group_id group); |
162 val tasks = Inttab.lookup_list groups (group_id group); |
163 val running = |
163 val running = |
164 fold (get_job jobs #> (fn Running t => insert Thread.equal t | _ => I)) tasks []; |
164 fold (get_job jobs #> (fn Running t => insert Thread.equal t | _ => I)) tasks []; |
165 val _ = List.app SimpleThread.interrupt running; |
165 val _ = List.app Simple_Thread.interrupt running; |
166 in null running end; |
166 in null running end; |
167 |
167 |
168 fun cancel_all (Queue {groups, jobs}) = |
168 fun cancel_all (Queue {groups, jobs}) = |
169 let |
169 let |
170 fun cancel_job (group, job) (groups, running) = |
170 fun cancel_job (group, job) (groups, running) = |
171 (cancel_group group Exn.Interrupt; |
171 (cancel_group group Exn.Interrupt; |
172 (case job of |
172 (case job of |
173 Running t => (insert eq_group group groups, insert Thread.equal t running) |
173 Running t => (insert eq_group group groups, insert Thread.equal t running) |
174 | _ => (groups, running))); |
174 | _ => (groups, running))); |
175 val (running_groups, running) = Task_Graph.fold (cancel_job o #1 o #2) jobs ([], []); |
175 val (running_groups, running) = Task_Graph.fold (cancel_job o #1 o #2) jobs ([], []); |
176 val _ = List.app SimpleThread.interrupt running; |
176 val _ = List.app Simple_Thread.interrupt running; |
177 in running_groups end; |
177 in running_groups end; |
178 |
178 |
179 |
179 |
180 (* enqueue *) |
180 (* enqueue *) |
181 |
181 |