ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveActionTest.java
Revision: 1.4
Committed: Sat Aug 1 22:09:13 2009 UTC (14 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.3: +1 -1 lines
Log Message:
typo fixes

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/licenses/publicdomain
5 */
6 import junit.framework.*;
7 import java.util.concurrent.*;
8 import java.util.*;
9
10
11 public class RecursiveActionTest extends JSR166TestCase {
12
13 public static void main(String[] args) {
14 junit.textui.TestRunner.run (suite());
15 }
16 public static Test suite() {
17 return new TestSuite(RecursiveActionTest.class);
18 }
19
20 static final ForkJoinPool mainPool = new ForkJoinPool();
21 static final ForkJoinPool singletonPool = new ForkJoinPool(1);
22 static final ForkJoinPool asyncSingletonPool = new ForkJoinPool(1);
23 static {
24 asyncSingletonPool.setAsyncMode(true);
25 }
26
27 static final class FJException extends RuntimeException {
28 FJException() { super(); }
29 }
30
31 // A simple recursive action for testing
32 static final class FibAction extends RecursiveAction {
33 final int number;
34 int result;
35 FibAction(int n) { number = n; }
36 public void compute() {
37 int n = number;
38 if (n <= 1)
39 result = n;
40 else {
41 FibAction f1 = new FibAction(n - 1);
42 FibAction f2 = new FibAction(n - 2);
43 invokeAll(f1, f2);
44 result = f1.result + f2.result;
45 }
46 }
47 }
48
49 // A recursive action failing in base case
50 static final class FailingFibAction extends RecursiveAction {
51 final int number;
52 int result;
53 FailingFibAction(int n) { number = n; }
54 public void compute() {
55 int n = number;
56 if (n <= 1)
57 throw new FJException();
58 else {
59 FailingFibAction f1 = new FailingFibAction(n - 1);
60 FailingFibAction f2 = new FailingFibAction(n - 2);
61 invokeAll(f1, f2);
62 result = f1.result + f2.result;
63 }
64 }
65 }
66
67 /**
68 * invoke returns when task completes normally.
69 * isCompletedAbnormally and isCancelled return false for normally
70 * completed tasks. getRawResult of a RecursiveAction returns null;
71 *
72 */
73 public void testInvoke() {
74 RecursiveAction a = new RecursiveAction() {
75 public void compute() {
76 FibAction f = new FibAction(8);
77 f.invoke();
78 threadAssertTrue(f.result == 21);
79 threadAssertTrue(f.isDone());
80 threadAssertFalse(f.isCancelled());
81 threadAssertFalse(f.isCompletedAbnormally());
82 threadAssertTrue(f.getRawResult() == null);
83 }
84 };
85 mainPool.invoke(a);
86 }
87
88 /**
89 * quietlyInvoke task returns when task completes normally.
90 * isCompletedAbnormally and isCancelled return false for normally
91 * completed tasks
92 */
93 public void testQuietlyInvoke() {
94 RecursiveAction a = new RecursiveAction() {
95 public void compute() {
96 FibAction f = new FibAction(8);
97 f.quietlyInvoke();
98 threadAssertTrue(f.result == 21);
99 threadAssertTrue(f.isDone());
100 threadAssertFalse(f.isCancelled());
101 threadAssertFalse(f.isCompletedAbnormally());
102 threadAssertTrue(f.getRawResult() == null);
103 }
104 };
105 mainPool.invoke(a);
106 }
107
108 /**
109 * join of a forked task returns when task completes
110 */
111 public void testForkJoin() {
112 RecursiveAction a = new RecursiveAction() {
113 public void compute() {
114 FibAction f = new FibAction(8);
115 f.fork();
116 f.join();
117 threadAssertTrue(f.result == 21);
118 threadAssertTrue(f.isDone());
119 threadAssertTrue(f.getRawResult() == null);
120 }
121 };
122 mainPool.invoke(a);
123 }
124
125 /**
126 * get of a forked task returns when task completes
127 */
128 public void testForkGet() {
129 RecursiveAction a = new RecursiveAction() {
130 public void compute() {
131 try {
132 FibAction f = new FibAction(8);
133 f.fork();
134 f.get();
135 threadAssertTrue(f.result == 21);
136 threadAssertTrue(f.isDone());
137 } catch (Exception ex) {
138 unexpectedException();
139 }
140 }
141 };
142 mainPool.invoke(a);
143 }
144
145 /**
146 * timed get of a forked task returns when task completes
147 */
148 public void testForkTimedGet() {
149 RecursiveAction a = new RecursiveAction() {
150 public void compute() {
151 try {
152 FibAction f = new FibAction(8);
153 f.fork();
154 f.get(5L, TimeUnit.SECONDS);
155 threadAssertTrue(f.result == 21);
156 threadAssertTrue(f.isDone());
157 } catch (Exception ex) {
158 unexpectedException();
159 }
160 }
161 };
162 mainPool.invoke(a);
163 }
164
165 /**
166 * timed get with null time unit throws NPE
167 */
168 public void testForkTimedGetNPE() {
169 RecursiveAction a = new RecursiveAction() {
170 public void compute() {
171 try {
172 FibAction f = new FibAction(8);
173 f.fork();
174 f.get(5L, null);
175 } catch (NullPointerException success) {
176 } catch (Exception ex) {
177 unexpectedException();
178 }
179 }
180 };
181 mainPool.invoke(a);
182 }
183
184 /**
185 * helpJoin of a forked task returns when task completes
186 */
187 public void testForkHelpJoin() {
188 RecursiveAction a = new RecursiveAction() {
189 public void compute() {
190 FibAction f = new FibAction(8);
191 f.fork();
192 f.helpJoin();
193 threadAssertTrue(f.result == 21);
194 threadAssertTrue(f.isDone());
195 }
196 };
197 mainPool.invoke(a);
198 }
199
200 /**
201 * quietlyJoin of a forked task returns when task completes
202 */
203 public void testForkQuietlyJoin() {
204 RecursiveAction a = new RecursiveAction() {
205 public void compute() {
206 FibAction f = new FibAction(8);
207 f.fork();
208 f.quietlyJoin();
209 threadAssertTrue(f.result == 21);
210 threadAssertTrue(f.isDone());
211 }
212 };
213 mainPool.invoke(a);
214 }
215
216
217 /**
218 * quietlyHelpJoin of a forked task returns when task completes
219 */
220 public void testForkQuietlyHelpJoin() {
221 RecursiveAction a = new RecursiveAction() {
222 public void compute() {
223 FibAction f = new FibAction(8);
224 f.fork();
225 f.quietlyHelpJoin();
226 threadAssertTrue(f.result == 21);
227 threadAssertTrue(f.isDone());
228 }
229 };
230 mainPool.invoke(a);
231 }
232
233
234 /**
235 * helpQuiesce returns when tasks are complete.
236 * getQueuedTaskCount returns 0 when quiescent
237 */
238 public void testForkHelpQuiesce() {
239 RecursiveAction a = new RecursiveAction() {
240 public void compute() {
241 FibAction f = new FibAction(8);
242 f.fork();
243 f.helpQuiesce();
244 threadAssertTrue(f.result == 21);
245 threadAssertTrue(f.isDone());
246 threadAssertTrue(getQueuedTaskCount() == 0);
247 }
248 };
249 mainPool.invoke(a);
250 }
251
252
253 /**
254 * invoke task throws exception when task completes abnormally
255 */
256 public void testAbnormalInvoke() {
257 RecursiveAction a = new RecursiveAction() {
258 public void compute() {
259 try {
260 FailingFibAction f = new FailingFibAction(8);
261 f.invoke();
262 shouldThrow();
263 } catch (FJException success) {
264 }
265 }
266 };
267 mainPool.invoke(a);
268 }
269
270 /**
271 * quietlyInvoke task returns when task completes abnormally
272 */
273 public void testAbnormalQuietlyInvoke() {
274 RecursiveAction a = new RecursiveAction() {
275 public void compute() {
276 FailingFibAction f = new FailingFibAction(8);
277 f.quietlyInvoke();
278 threadAssertTrue(f.isDone());
279 }
280 };
281 mainPool.invoke(a);
282 }
283
284 /**
285 * join of a forked task throws exception when task completes abnormally
286 */
287 public void testAbnormalForkJoin() {
288 RecursiveAction a = new RecursiveAction() {
289 public void compute() {
290 try {
291 FailingFibAction f = new FailingFibAction(8);
292 f.fork();
293 f.join();
294 shouldThrow();
295 } catch (FJException success) {
296 }
297 }
298 };
299 mainPool.invoke(a);
300 }
301
302 /**
303 * get of a forked task throws exception when task completes abnormally
304 */
305 public void testAbnormalForkGet() {
306 RecursiveAction a = new RecursiveAction() {
307 public void compute() {
308 try {
309 FailingFibAction f = new FailingFibAction(8);
310 f.fork();
311 f.get();
312 shouldThrow();
313 } catch (Exception success) {
314 }
315 }
316 };
317 mainPool.invoke(a);
318 }
319
320 /**
321 * timed get of a forked task throws exception when task completes abnormally
322 */
323 public void testAbnormalForkTimedGet() {
324 RecursiveAction a = new RecursiveAction() {
325 public void compute() {
326 try {
327 FailingFibAction f = new FailingFibAction(8);
328 f.fork();
329 f.get(5L, TimeUnit.SECONDS);
330 shouldThrow();
331 } catch (Exception success) {
332 }
333 }
334 };
335 mainPool.invoke(a);
336 }
337
338 /**
339 * join of a forked task throws exception when task completes abnormally
340 */
341 public void testAbnormalForkHelpJoin() {
342 RecursiveAction a = new RecursiveAction() {
343 public void compute() {
344 try {
345 FailingFibAction f = new FailingFibAction(8);
346 f.fork();
347 f.helpJoin();
348 shouldThrow();
349 } catch (FJException success) {
350 }
351 }
352 };
353 mainPool.invoke(a);
354 }
355
356 /**
357 * quietlyHelpJoin of a forked task returns when task completes abnormally.
358 * getException of failed task returns its exception.
359 * isCompletedAbnormally of a failed task returns true.
360 * isCancelled of a failed uncancelled task returns false
361 */
362 public void testAbnormalForkQuietlyHelpJoin() {
363 RecursiveAction a = new RecursiveAction() {
364 public void compute() {
365 FailingFibAction f = new FailingFibAction(8);
366 f.fork();
367 f.quietlyHelpJoin();
368 threadAssertTrue(f.isDone());
369 threadAssertTrue(f.isCompletedAbnormally());
370 threadAssertFalse(f.isCancelled());
371 threadAssertTrue(f.getException() instanceof FJException);
372 }
373 };
374 mainPool.invoke(a);
375 }
376
377 /**
378 * quietlyJoin of a forked task returns when task completes abnormally
379 */
380 public void testAbnormalForkQuietlyJoin() {
381 RecursiveAction a = new RecursiveAction() {
382 public void compute() {
383 FailingFibAction f = new FailingFibAction(8);
384 f.fork();
385 f.quietlyJoin();
386 threadAssertTrue(f.isDone());
387 threadAssertTrue(f.isCompletedAbnormally());
388 threadAssertTrue(f.getException() instanceof FJException);
389 }
390 };
391 mainPool.invoke(a);
392 }
393
394 /**
395 * invoke task throws exception when task cancelled
396 */
397 public void testCancelledInvoke() {
398 RecursiveAction a = new RecursiveAction() {
399 public void compute() {
400 try {
401 FibAction f = new FibAction(8);
402 f.cancel(true);
403 f.invoke();
404 shouldThrow();
405 } catch (CancellationException success) {
406 }
407 }
408 };
409 mainPool.invoke(a);
410 }
411
412 /**
413 * join of a forked task throws exception when task cancelled
414 */
415 public void testCancelledForkJoin() {
416 RecursiveAction a = new RecursiveAction() {
417 public void compute() {
418 try {
419 FibAction f = new FibAction(8);
420 f.cancel(true);
421 f.fork();
422 f.join();
423 shouldThrow();
424 } catch (CancellationException success) {
425 }
426 }
427 };
428 mainPool.invoke(a);
429 }
430
431 /**
432 * get of a forked task throws exception when task cancelled
433 */
434 public void testCancelledForkGet() {
435 RecursiveAction a = new RecursiveAction() {
436 public void compute() {
437 try {
438 FibAction f = new FibAction(8);
439 f.cancel(true);
440 f.fork();
441 f.get();
442 shouldThrow();
443 } catch (Exception success) {
444 }
445 }
446 };
447 mainPool.invoke(a);
448 }
449
450 /**
451 * timed get of a forked task throws exception when task cancelled
452 */
453 public void testCancelledForkTimedGet() {
454 RecursiveAction a = new RecursiveAction() {
455 public void compute() {
456 try {
457 FibAction f = new FibAction(8);
458 f.cancel(true);
459 f.fork();
460 f.get(5L, TimeUnit.SECONDS);
461 shouldThrow();
462 } catch (Exception success) {
463 }
464 }
465 };
466 mainPool.invoke(a);
467 }
468
469 /**
470 * join of a forked task throws exception when task cancelled
471 */
472 public void testCancelledForkHelpJoin() {
473 RecursiveAction a = new RecursiveAction() {
474 public void compute() {
475 try {
476 FibAction f = new FibAction(8);
477 f.cancel(true);
478 f.fork();
479 f.helpJoin();
480 shouldThrow();
481 } catch (CancellationException success) {
482 }
483 }
484 };
485 mainPool.invoke(a);
486 }
487
488 /**
489 * quietlyHelpJoin of a forked task returns when task cancelled.
490 * getException of cancelled task returns its exception.
491 * isCompletedAbnormally of a cancelled task returns true.
492 * isCancelled of a cancelled task returns true
493 */
494 public void testCancelledForkQuietlyHelpJoin() {
495 RecursiveAction a = new RecursiveAction() {
496 public void compute() {
497 FibAction f = new FibAction(8);
498 f.cancel(true);
499 f.fork();
500 f.quietlyHelpJoin();
501 threadAssertTrue(f.isDone());
502 threadAssertTrue(f.isCompletedAbnormally());
503 threadAssertTrue(f.isCancelled());
504 threadAssertTrue(f.getException() instanceof CancellationException);
505 }
506 };
507 mainPool.invoke(a);
508 }
509
510 /**
511 * quietlyJoin of a forked task returns when task cancelled
512 */
513 public void testCancelledForkQuietlyJoin() {
514 RecursiveAction a = new RecursiveAction() {
515 public void compute() {
516 FibAction f = new FibAction(8);
517 f.cancel(true);
518 f.fork();
519 f.quietlyJoin();
520 threadAssertTrue(f.isDone());
521 threadAssertTrue(f.isCompletedAbnormally());
522 threadAssertTrue(f.getException() instanceof CancellationException);
523 }
524 };
525 mainPool.invoke(a);
526 }
527
528 /**
529 * getPool of executing task returns its pool
530 */
531 public void testGetPool() {
532 RecursiveAction a = new RecursiveAction() {
533 public void compute() {
534 threadAssertTrue(getPool() == mainPool);
535 }
536 };
537 mainPool.invoke(a);
538 }
539
540 /**
541 * getPool of non-FJ task returns null
542 */
543 public void testGetPool2() {
544 RecursiveAction a = new RecursiveAction() {
545 public void compute() {
546 threadAssertTrue(getPool() == null);
547 }
548 };
549 a.invoke();
550 }
551
552 /**
553 * inForkJoinPool of executing task returns true
554 */
555 public void testInForkJoinPool() {
556 RecursiveAction a = new RecursiveAction() {
557 public void compute() {
558 threadAssertTrue(inForkJoinPool());
559 }
560 };
561 mainPool.invoke(a);
562 }
563
564 /**
565 * inForkJoinPool of non-FJ task returns false
566 */
567 public void testInForkJoinPool2() {
568 RecursiveAction a = new RecursiveAction() {
569 public void compute() {
570 threadAssertTrue(!inForkJoinPool());
571 }
572 };
573 a.invoke();
574 }
575
576 /**
577 * getPool of current thread in pool returns its pool
578 */
579 public void testWorkerGetPool() {
580 RecursiveAction a = new RecursiveAction() {
581 public void compute() {
582 ForkJoinWorkerThread w =
583 (ForkJoinWorkerThread)(Thread.currentThread());
584 threadAssertTrue(w.getPool() == mainPool);
585 }
586 };
587 mainPool.invoke(a);
588 }
589
590 /**
591 * getPoolIndex of current thread in pool returns 0 <= value < poolSize
592 *
593 */
594 public void testWorkerGetPoolIndex() {
595 RecursiveAction a = new RecursiveAction() {
596 public void compute() {
597 ForkJoinWorkerThread w =
598 (ForkJoinWorkerThread)(Thread.currentThread());
599 int idx = w.getPoolIndex();
600 threadAssertTrue(idx >= 0);
601 threadAssertTrue(idx < mainPool.getPoolSize());
602 }
603 };
604 mainPool.invoke(a);
605 }
606
607
608 /**
609 * setRawResult(null) succeeds
610 */
611 public void testSetRawResult() {
612 RecursiveAction a = new RecursiveAction() {
613 public void compute() {
614 setRawResult(null);
615 }
616 };
617 a.invoke();
618 }
619
620 /**
621 * A reinitialized task may be re-invoked
622 */
623 public void testReinitialize() {
624 RecursiveAction a = new RecursiveAction() {
625 public void compute() {
626 FibAction f = new FibAction(8);
627 f.invoke();
628 threadAssertTrue(f.result == 21);
629 threadAssertTrue(f.isDone());
630 threadAssertFalse(f.isCancelled());
631 threadAssertFalse(f.isCompletedAbnormally());
632 f.reinitialize();
633 f.invoke();
634 threadAssertTrue(f.result == 21);
635 }
636 };
637 mainPool.invoke(a);
638 }
639
640 /**
641 * invoke task throws exception after invoking completeExceptionally
642 */
643 public void testCompleteExceptionally() {
644 RecursiveAction a = new RecursiveAction() {
645 public void compute() {
646 try {
647 FibAction f = new FibAction(8);
648 f.completeExceptionally(new FJException());
649 f.invoke();
650 shouldThrow();
651 } catch (FJException success) {
652 }
653 }
654 };
655 mainPool.invoke(a);
656 }
657
658 /**
659 * invoke task suppresses execution invoking complete
660 */
661 public void testComplete() {
662 RecursiveAction a = new RecursiveAction() {
663 public void compute() {
664 FibAction f = new FibAction(8);
665 f.complete(null);
666 f.invoke();
667 threadAssertTrue(f.isDone());
668 threadAssertTrue(f.result == 0);
669 }
670 };
671 mainPool.invoke(a);
672 }
673
674 /**
675 * invokeAll(t1, t2) invokes all task arguments
676 */
677 public void testInvokeAll2() {
678 RecursiveAction a = new RecursiveAction() {
679 public void compute() {
680 FibAction f = new FibAction(8);
681 FibAction g = new FibAction(9);
682 invokeAll(f, g);
683 threadAssertTrue(f.isDone());
684 threadAssertTrue(f.result == 21);
685 threadAssertTrue(g.isDone());
686 threadAssertTrue(g.result == 34);
687 }
688 };
689 mainPool.invoke(a);
690 }
691
692 /**
693 * invokeAll(tasks) with 1 argument invokes task
694 */
695 public void testInvokeAll1() {
696 RecursiveAction a = new RecursiveAction() {
697 public void compute() {
698 FibAction f = new FibAction(8);
699 invokeAll(f);
700 threadAssertTrue(f.isDone());
701 threadAssertTrue(f.result == 21);
702 }
703 };
704 mainPool.invoke(a);
705 }
706
707 /**
708 * invokeAll(tasks) with > 2 argument invokes tasks
709 */
710 public void testInvokeAll3() {
711 RecursiveAction a = new RecursiveAction() {
712 public void compute() {
713 FibAction f = new FibAction(8);
714 FibAction g = new FibAction(9);
715 FibAction h = new FibAction(7);
716 invokeAll(f, g, h);
717 threadAssertTrue(f.isDone());
718 threadAssertTrue(f.result == 21);
719 threadAssertTrue(g.isDone());
720 threadAssertTrue(g.result == 34);
721 threadAssertTrue(h.isDone());
722 threadAssertTrue(h.result == 13);
723 }
724 };
725 mainPool.invoke(a);
726 }
727
728 /**
729 * invokeAll(collection) invokes all tasks in the collection
730 */
731 public void testInvokeAllCollection() {
732 RecursiveAction a = new RecursiveAction() {
733 public void compute() {
734 FibAction f = new FibAction(8);
735 FibAction g = new FibAction(9);
736 FibAction h = new FibAction(7);
737 HashSet set = new HashSet();
738 set.add(f);
739 set.add(g);
740 set.add(h);
741 invokeAll(set);
742 threadAssertTrue(f.isDone());
743 threadAssertTrue(f.result == 21);
744 threadAssertTrue(g.isDone());
745 threadAssertTrue(g.result == 34);
746 threadAssertTrue(h.isDone());
747 threadAssertTrue(h.result == 13);
748 }
749 };
750 mainPool.invoke(a);
751 }
752
753
754 /**
755 * invokeAll(tasks) with any null task throws NPE
756 */
757 public void testInvokeAllNPE() {
758 RecursiveAction a = new RecursiveAction() {
759 public void compute() {
760 try {
761 FibAction f = new FibAction(8);
762 FibAction g = new FibAction(9);
763 FibAction h = null;
764 invokeAll(f, g, h);
765 shouldThrow();
766 } catch (NullPointerException success) {
767 }
768 }
769 };
770 mainPool.invoke(a);
771 }
772
773 /**
774 * invokeAll(t1, t2) throw exception if any task does
775 */
776 public void testAbnormalInvokeAll2() {
777 RecursiveAction a = new RecursiveAction() {
778 public void compute() {
779 try {
780 FibAction f = new FibAction(8);
781 FailingFibAction g = new FailingFibAction(9);
782 invokeAll(f, g);
783 shouldThrow();
784 } catch (FJException success) {
785 }
786 }
787 };
788 mainPool.invoke(a);
789 }
790
791 /**
792 * invokeAll(tasks) with 1 argument throws exception if task does
793 */
794 public void testAbnormalInvokeAll1() {
795 RecursiveAction a = new RecursiveAction() {
796 public void compute() {
797 try {
798 FailingFibAction g = new FailingFibAction(9);
799 invokeAll(g);
800 shouldThrow();
801 } catch (FJException success) {
802 }
803 }
804 };
805 mainPool.invoke(a);
806 }
807
808 /**
809 * invokeAll(tasks) with > 2 argument throws exception if any task does
810 */
811 public void testAbnormalInvokeAll3() {
812 RecursiveAction a = new RecursiveAction() {
813 public void compute() {
814 try {
815 FibAction f = new FibAction(8);
816 FailingFibAction g = new FailingFibAction(9);
817 FibAction h = new FibAction(7);
818 invokeAll(f, g, h);
819 shouldThrow();
820 } catch (FJException success) {
821 }
822 }
823 };
824 mainPool.invoke(a);
825 }
826
827 /**
828 * invokeAll(collection) throws exception if any task does
829 */
830 public void testAbnormalInvokeAllCollection() {
831 RecursiveAction a = new RecursiveAction() {
832 public void compute() {
833 try {
834 FailingFibAction f = new FailingFibAction(8);
835 FibAction g = new FibAction(9);
836 FibAction h = new FibAction(7);
837 HashSet set = new HashSet();
838 set.add(f);
839 set.add(g);
840 set.add(h);
841 invokeAll(set);
842 shouldThrow();
843 } catch (FJException success) {
844 }
845 }
846 };
847 mainPool.invoke(a);
848 }
849
850 /**
851 * tryUnfork returns true for most recent unexecuted task,
852 * and suppresses execution
853 */
854 public void testTryUnfork() {
855 RecursiveAction a = new RecursiveAction() {
856 public void compute() {
857 FibAction g = new FibAction(9);
858 g.fork();
859 FibAction f = new FibAction(8);
860 f.fork();
861 threadAssertTrue(f.tryUnfork());
862 helpQuiesce();
863 threadAssertFalse(f.isDone());
864 threadAssertTrue(g.isDone());
865 }
866 };
867 singletonPool.invoke(a);
868 }
869
870 /**
871 * getSurplusQueuedTaskCount returns > 0 when
872 * there are more tasks than threads
873 */
874 public void testGetSurplusQueuedTaskCount() {
875 RecursiveAction a = new RecursiveAction() {
876 public void compute() {
877 FibAction h = new FibAction(7);
878 h.fork();
879 FibAction g = new FibAction(9);
880 g.fork();
881 FibAction f = new FibAction(8);
882 f.fork();
883 threadAssertTrue(getSurplusQueuedTaskCount() > 0);
884 helpQuiesce();
885 }
886 };
887 singletonPool.invoke(a);
888 }
889
890 /**
891 * peekNextLocalTask returns most recent unexecuted task.
892 */
893 public void testPeekNextLocalTask() {
894 RecursiveAction a = new RecursiveAction() {
895 public void compute() {
896 FibAction g = new FibAction(9);
897 g.fork();
898 FibAction f = new FibAction(8);
899 f.fork();
900 threadAssertTrue(peekNextLocalTask() == f);
901 f.join();
902 threadAssertTrue(f.isDone());
903 helpQuiesce();
904 }
905 };
906 singletonPool.invoke(a);
907 }
908
909 /**
910 * pollNextLocalTask returns most recent unexecuted task
911 * without executing it
912 */
913 public void testPollNextLocalTask() {
914 RecursiveAction a = new RecursiveAction() {
915 public void compute() {
916 FibAction g = new FibAction(9);
917 g.fork();
918 FibAction f = new FibAction(8);
919 f.fork();
920 threadAssertTrue(pollNextLocalTask() == f);
921 helpQuiesce();
922 threadAssertFalse(f.isDone());
923 }
924 };
925 singletonPool.invoke(a);
926 }
927
928 /**
929 * pollTask returns an unexecuted task
930 * without executing it
931 */
932 public void testPollTask() {
933 RecursiveAction a = new RecursiveAction() {
934 public void compute() {
935 FibAction g = new FibAction(9);
936 g.fork();
937 FibAction f = new FibAction(8);
938 f.fork();
939 threadAssertTrue(pollTask() == f);
940 helpQuiesce();
941 threadAssertFalse(f.isDone());
942 threadAssertTrue(g.isDone());
943 }
944 };
945 singletonPool.invoke(a);
946 }
947
948 /**
949 * peekNextLocalTask returns least recent unexecuted task in async mode
950 */
951 public void testPeekNextLocalTaskAsync() {
952 RecursiveAction a = new RecursiveAction() {
953 public void compute() {
954 FibAction g = new FibAction(9);
955 g.fork();
956 FibAction f = new FibAction(8);
957 f.fork();
958 threadAssertTrue(peekNextLocalTask() == g);
959 f.join();
960 helpQuiesce();
961 threadAssertTrue(f.isDone());
962 }
963 };
964 asyncSingletonPool.invoke(a);
965 }
966
967 /**
968 * pollNextLocalTask returns least recent unexecuted task
969 * without executing it, in async mode
970 */
971 public void testPollNextLocalTaskAsync() {
972 RecursiveAction a = new RecursiveAction() {
973 public void compute() {
974 FibAction g = new FibAction(9);
975 g.fork();
976 FibAction f = new FibAction(8);
977 f.fork();
978 threadAssertTrue(pollNextLocalTask() == g);
979 helpQuiesce();
980 threadAssertTrue(f.isDone());
981 threadAssertFalse(g.isDone());
982 }
983 };
984 asyncSingletonPool.invoke(a);
985 }
986
987 /**
988 * pollTask returns an unexecuted task
989 * without executing it, in async mode
990 */
991 public void testPollTaskAsync() {
992 RecursiveAction a = new RecursiveAction() {
993 public void compute() {
994 FibAction g = new FibAction(9);
995 g.fork();
996 FibAction f = new FibAction(8);
997 f.fork();
998 threadAssertTrue(pollTask() == g);
999 helpQuiesce();
1000 threadAssertTrue(f.isDone());
1001 threadAssertFalse(g.isDone());
1002 }
1003 };
1004 asyncSingletonPool.invoke(a);
1005 }
1006
1007 }