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/publicdomain/zero/1.0/ 5 */ 6 7 package java.util.concurrent; 8 9 /** 10 * A {@link ForkJoinTask} with a completion action performed when 11 * triggered and there are no remaining pending actions. 12 * CountedCompleters are in general more robust in the 13 * presence of subtask stalls and blockage than are other forms of 14 * ForkJoinTasks, but are less intuitive to program. Uses of 15 * CountedCompleter are similar to those of other completion based 16 * components (such as {@link java.nio.channels.CompletionHandler}) 17 * except that multiple <em>pending</em> completions may be necessary 18 * to trigger the completion action {@link #onCompletion(CountedCompleter)}, 19 * not just one. 20 * Unless initialized otherwise, the {@linkplain #getPendingCount pending 21 * count} starts at zero, but may be (atomically) changed using 22 * methods {@link #setPendingCount}, {@link #addToPendingCount}, and 23 * {@link #compareAndSetPendingCount}. Upon invocation of {@link 24 * #tryComplete}, if the pending action count is nonzero, it is 25 * decremented; otherwise, the completion action is performed, and if 26 * this completer itself has a completer, the process is continued 27 * with its completer. As is the case with related synchronization 28 * components such as {@link java.util.concurrent.Phaser Phaser} and 29 * {@link java.util.concurrent.Semaphore Semaphore}, these methods 30 * affect only internal counts; they do not establish any further 31 * internal bookkeeping. In particular, the identities of pending 32 * tasks are not maintained. As illustrated below, you can create 33 * subclasses that do record some or all pending tasks or their 34 * results when needed. As illustrated below, utility methods 35 * supporting customization of completion traversals are also 36 * provided. However, because CountedCompleters provide only basic 37 * synchronization mechanisms, it may be useful to create further 38 * abstract subclasses that maintain linkages, fields, and additional 39 * support methods appropriate for a set of related usages. 40 * 41 * <p>A concrete CountedCompleter class must define method {@link 42 * #compute}, that should in most cases (as illustrated below), invoke 43 * {@code tryComplete()} once before returning. The class may also 44 * optionally override method {@link #onCompletion(CountedCompleter)} 45 * to perform an action upon normal completion, and method 46 * {@link #onExceptionalCompletion(Throwable, CountedCompleter)} to 47 * perform an action upon any exception. 48 * 49 * <p>CountedCompleters most often do not bear results, in which case 50 * they are normally declared as {@code CountedCompleter<Void>}, and 51 * will always return {@code null} as a result value. In other cases, 52 * you should override method {@link #getRawResult} to provide a 53 * result from {@code join(), invoke()}, and related methods. In 54 * general, this method should return the value of a field (or a 55 * function of one or more fields) of the CountedCompleter object that 56 * holds the result upon completion. Method {@link #setRawResult} by 57 * default plays no role in CountedCompleters. It is possible, but 58 * rarely applicable, to override this method to maintain other 59 * objects or fields holding result data. 60 * 61 * <p>A CountedCompleter that does not itself have a completer (i.e., 62 * one for which {@link #getCompleter} returns {@code null}) can be 63 * used as a regular ForkJoinTask with this added functionality. 64 * However, any completer that in turn has another completer serves 65 * only as an internal helper for other computations, so its own task 66 * status (as reported in methods such as {@link ForkJoinTask#isDone}) 67 * is arbitrary; this status changes only upon explicit invocations of 68 * {@link #complete}, {@link ForkJoinTask#cancel}, 69 * {@link ForkJoinTask#completeExceptionally(Throwable)} or upon 70 * exceptional completion of method {@code compute}. Upon any 71 * exceptional completion, the exception may be relayed to a task's 72 * completer (and its completer, and so on), if one exists and it has 73 * not otherwise already completed. Similarly, cancelling an internal 74 * CountedCompleter has only a local effect on that completer, so is 75 * not often useful. 76 * 77 * <p><b>Sample Usages.</b> 78 * 79 * <p><b>Parallel recursive decomposition.</b> CountedCompleters may 80 * be arranged in trees similar to those often used with {@link 81 * RecursiveAction}s, although the constructions involved in setting 82 * them up typically vary. Here, the completer of each task is its 83 * parent in the computation tree. Even though they entail a bit more 84 * bookkeeping, CountedCompleters may be better choices when applying 85 * a possibly time-consuming operation (that cannot be further 86 * subdivided) to each element of an array or collection; especially 87 * when the operation takes a significantly different amount of time 88 * to complete for some elements than others, either because of 89 * intrinsic variation (for example I/O) or auxiliary effects such as 90 * garbage collection. Because CountedCompleters provide their own 91 * continuations, other threads need not block waiting to perform 92 * them. 93 * 94 * <p>For example, here is an initial version of a class that uses 95 * divide-by-two recursive decomposition to divide work into single 96 * pieces (leaf tasks). Even when work is split into individual calls, 97 * tree-based techniques are usually preferable to directly forking 98 * leaf tasks, because they reduce inter-thread communication and 99 * improve load balancing. In the recursive case, the second of each 100 * pair of subtasks to finish triggers completion of its parent 101 * (because no result combination is performed, the default no-op 102 * implementation of method {@code onCompletion} is not overridden). 103 * A static utility method sets up the base task and invokes it 104 * (here, implicitly using the {@link ForkJoinPool#commonPool()}). 105 * 106 * <pre> {@code 107 * class MyOperation<E> { void apply(E e) { ... } } 108 * 109 * class ForEach<E> extends CountedCompleter<Void> { 110 * 111 * public static <E> void forEach(E[] array, MyOperation<E> op) { 112 * new ForEach<E>(null, array, op, 0, array.length).invoke(); 113 * } 114 * 115 * final E[] array; final MyOperation<E> op; final int lo, hi; 116 * ForEach(CountedCompleter<?> p, E[] array, MyOperation<E> op, int lo, int hi) { 117 * super(p); 118 * this.array = array; this.op = op; this.lo = lo; this.hi = hi; 119 * } 120 * 121 * public void compute() { // version 1 122 * if (hi - lo >= 2) { 123 * int mid = (lo + hi) >>> 1; 124 * setPendingCount(2); // must set pending count before fork 125 * new ForEach(this, array, op, mid, hi).fork(); // right child 126 * new ForEach(this, array, op, lo, mid).fork(); // left child 127 * } 128 * else if (hi > lo) 129 * op.apply(array[lo]); 130 * tryComplete(); 131 * } 132 * }}</pre> 133 * 134 * This design can be improved by noticing that in the recursive case, 135 * the task has nothing to do after forking its right task, so can 136 * directly invoke its left task before returning. (This is an analog 137 * of tail recursion removal.) Also, because the task returns upon 138 * executing its left task (rather than falling through to invoke 139 * {@code tryComplete}) the pending count is set to one: 140 * 141 * <pre> {@code 142 * class ForEach<E> ... 143 * public void compute() { // version 2 144 * if (hi - lo >= 2) { 145 * int mid = (lo + hi) >>> 1; 146 * setPendingCount(1); // only one pending 147 * new ForEach(this, array, op, mid, hi).fork(); // right child 148 * new ForEach(this, array, op, lo, mid).compute(); // direct invoke 149 * } 150 * else { 151 * if (hi > lo) 152 * op.apply(array[lo]); 153 * tryComplete(); 154 * } 155 * } 156 * }</pre> 157 * 158 * As a further improvement, notice that the left task need not even exist. 159 * Instead of creating a new one, we can iterate using the original task, 160 * and add a pending count for each fork. Additionally, because no task 161 * in this tree implements an {@link #onCompletion(CountedCompleter)} method, 162 * {@code tryComplete()} can be replaced with {@link #propagateCompletion}. 163 * 164 * <pre> {@code 165 * class ForEach<E> ... 166 * public void compute() { // version 3 167 * int l = lo, h = hi; 168 * while (h - l >= 2) { 169 * int mid = (l + h) >>> 1; 170 * addToPendingCount(1); 171 * new ForEach(this, array, op, mid, h).fork(); // right child 172 * h = mid; 173 * } 174 * if (h > l) 175 * op.apply(array[l]); 176 * propagateCompletion(); 177 * } 178 * }</pre> 179 * 180 * Additional improvements of such classes might entail precomputing 181 * pending counts so that they can be established in constructors, 182 * specializing classes for leaf steps, subdividing by say, four, 183 * instead of two per iteration, and using an adaptive threshold 184 * instead of always subdividing down to single elements. 185 * 186 * <p><b>Searching.</b> A tree of CountedCompleters can search for a 187 * value or property in different parts of a data structure, and 188 * report a result in an {@link 189 * java.util.concurrent.atomic.AtomicReference AtomicReference} as 190 * soon as one is found. The others can poll the result to avoid 191 * unnecessary work. (You could additionally {@linkplain #cancel 192 * cancel} other tasks, but it is usually simpler and more efficient 193 * to just let them notice that the result is set and if so skip 194 * further processing.) Illustrating again with an array using full 195 * partitioning (again, in practice, leaf tasks will almost always 196 * process more than one element): 197 * 198 * <pre> {@code 199 * class Searcher<E> extends CountedCompleter<E> { 200 * final E[] array; final AtomicReference<E> result; final int lo, hi; 201 * Searcher(CountedCompleter<?> p, E[] array, AtomicReference<E> result, int lo, int hi) { 202 * super(p); 203 * this.array = array; this.result = result; this.lo = lo; this.hi = hi; 204 * } 205 * public E getRawResult() { return result.get(); } 206 * public void compute() { // similar to ForEach version 3 207 * int l = lo, h = hi; 208 * while (result.get() == null && h >= l) { 209 * if (h - l >= 2) { 210 * int mid = (l + h) >>> 1; 211 * addToPendingCount(1); 212 * new Searcher(this, array, result, mid, h).fork(); 213 * h = mid; 214 * } 215 * else { 216 * E x = array[l]; 217 * if (matches(x) && result.compareAndSet(null, x)) 218 * quietlyCompleteRoot(); // root task is now joinable 219 * break; 220 * } 221 * } 222 * tryComplete(); // normally complete whether or not found 223 * } 224 * boolean matches(E e) { ... } // return true if found 225 * 226 * public static <E> E search(E[] array) { 227 * return new Searcher<E>(null, array, new AtomicReference<E>(), 0, array.length).invoke(); 228 * } 229 * }}</pre> 230 * 231 * In this example, as well as others in which tasks have no other 232 * effects except to compareAndSet a common result, the trailing 233 * unconditional invocation of {@code tryComplete} could be made 234 * conditional ({@code if (result.get() == null) tryComplete();}) 235 * because no further bookkeeping is required to manage completions 236 * once the root task completes. 237 * 238 * <p><b>Recording subtasks.</b> CountedCompleter tasks that combine 239 * results of multiple subtasks usually need to access these results 240 * in method {@link #onCompletion(CountedCompleter)}. As illustrated in the following 241 * class (that performs a simplified form of map-reduce where mappings 242 * and reductions are all of type {@code E}), one way to do this in 243 * divide and conquer designs is to have each subtask record its 244 * sibling, so that it can be accessed in method {@code onCompletion}. 245 * This technique applies to reductions in which the order of 246 * combining left and right results does not matter; ordered 247 * reductions require explicit left/right designations. Variants of 248 * other streamlinings seen in the above examples may also apply. 249 * 250 * <pre> {@code 251 * class MyMapper<E> { E apply(E v) { ... } } 252 * class MyReducer<E> { E apply(E x, E y) { ... } } 253 * class MapReducer<E> extends CountedCompleter<E> { 254 * final E[] array; final MyMapper<E> mapper; 255 * final MyReducer<E> reducer; final int lo, hi; 256 * MapReducer<E> sibling; 257 * E result; 258 * MapReducer(CountedCompleter<?> p, E[] array, MyMapper<E> mapper, 259 * MyReducer<E> reducer, int lo, int hi) { 260 * super(p); 261 * this.array = array; this.mapper = mapper; 262 * this.reducer = reducer; this.lo = lo; this.hi = hi; 263 * } 264 * public void compute() { 265 * if (hi - lo >= 2) { 266 * int mid = (lo + hi) >>> 1; 267 * MapReducer<E> left = new MapReducer(this, array, mapper, reducer, lo, mid); 268 * MapReducer<E> right = new MapReducer(this, array, mapper, reducer, mid, hi); 269 * left.sibling = right; 270 * right.sibling = left; 271 * setPendingCount(1); // only right is pending 272 * right.fork(); 273 * left.compute(); // directly execute left 274 * } 275 * else { 276 * if (hi > lo) 277 * result = mapper.apply(array[lo]); 278 * tryComplete(); 279 * } 280 * } 281 * public void onCompletion(CountedCompleter<?> caller) { 282 * if (caller != this) { 283 * MapReducer<E> child = (MapReducer<E>)caller; 284 * MapReducer<E> sib = child.sibling; 285 * if (sib == null || sib.result == null) 286 * result = child.result; 287 * else 288 * result = reducer.apply(child.result, sib.result); 289 * } 290 * } 291 * public E getRawResult() { return result; } 292 * 293 * public static <E> E mapReduce(E[] array, MyMapper<E> mapper, MyReducer<E> reducer) { 294 * return new MapReducer<E>(null, array, mapper, reducer, 295 * 0, array.length).invoke(); 296 * } 297 * }}</pre> 298 * 299 * Here, method {@code onCompletion} takes a form common to many 300 * completion designs that combine results. This callback-style method 301 * is triggered once per task, in either of the two different contexts 302 * in which the pending count is, or becomes, zero: (1) by a task 303 * itself, if its pending count is zero upon invocation of {@code 304 * tryComplete}, or (2) by any of its subtasks when they complete and 305 * decrement the pending count to zero. The {@code caller} argument 306 * distinguishes cases. Most often, when the caller is {@code this}, 307 * no action is necessary. Otherwise the caller argument can be used 308 * (usually via a cast) to supply a value (and/or links to other 309 * values) to be combined. Assuming proper use of pending counts, the 310 * actions inside {@code onCompletion} occur (once) upon completion of 311 * a task and its subtasks. No additional synchronization is required 312 * within this method to ensure thread safety of accesses to fields of 313 * this task or other completed tasks. 314 * 315 * <p><b>Completion Traversals</b>. If using {@code onCompletion} to 316 * process completions is inapplicable or inconvenient, you can use 317 * methods {@link #firstComplete} and {@link #nextComplete} to create 318 * custom traversals. For example, to define a MapReducer that only 319 * splits out right-hand tasks in the form of the third ForEach 320 * example, the completions must cooperatively reduce along 321 * unexhausted subtask links, which can be done as follows: 322 * 323 * <pre> {@code 324 * class MapReducer<E> extends CountedCompleter<E> { // version 2 325 * final E[] array; final MyMapper<E> mapper; 326 * final MyReducer<E> reducer; final int lo, hi; 327 * MapReducer<E> forks, next; // record subtask forks in list 328 * E result; 329 * MapReducer(CountedCompleter<?> p, E[] array, MyMapper<E> mapper, 330 * MyReducer<E> reducer, int lo, int hi, MapReducer<E> next) { 331 * super(p); 332 * this.array = array; this.mapper = mapper; 333 * this.reducer = reducer; this.lo = lo; this.hi = hi; 334 * this.next = next; 335 * } 336 * public void compute() { 337 * int l = lo, h = hi; 338 * while (h - l >= 2) { 339 * int mid = (l + h) >>> 1; 340 * addToPendingCount(1); 341 * (forks = new MapReducer(this, array, mapper, reducer, mid, h, forks)).fork(); 342 * h = mid; 343 * } 344 * if (h > l) 345 * result = mapper.apply(array[l]); 346 * // process completions by reducing along and advancing subtask links 347 * for (CountedCompleter<?> c = firstComplete(); c != null; c = c.nextComplete()) { 348 * for (MapReducer t = (MapReducer)c, s = t.forks; s != null; s = t.forks = s.next) 349 * t.result = reducer.apply(t.result, s.result); 350 * } 351 * } 352 * public E getRawResult() { return result; } 353 * 354 * public static <E> E mapReduce(E[] array, MyMapper<E> mapper, MyReducer<E> reducer) { 355 * return new MapReducer<E>(null, array, mapper, reducer, 356 * 0, array.length, null).invoke(); 357 * } 358 * }}</pre> 359 * 360 * <p><b>Triggers.</b> Some CountedCompleters are themselves never 361 * forked, but instead serve as bits of plumbing in other designs; 362 * including those in which the completion of one or more async tasks 363 * triggers another async task. For example: 364 * 365 * <pre> {@code 366 * class HeaderBuilder extends CountedCompleter<...> { ... } 367 * class BodyBuilder extends CountedCompleter<...> { ... } 368 * class PacketSender extends CountedCompleter<...> { 369 * PacketSender(...) { super(null, 1); ... } // trigger on second completion 370 * public void compute() { } // never called 371 * public void onCompletion(CountedCompleter<?> caller) { sendPacket(); } 372 * } 373 * // sample use: 374 * PacketSender p = new PacketSender(); 375 * new HeaderBuilder(p, ...).fork(); 376 * new BodyBuilder(p, ...).fork(); 377 * }</pre> 378 * 379 * @since 1.8 380 * @hide 381 * @author Doug Lea 382 */ 383 public abstract class CountedCompleter<T> extends ForkJoinTask<T> { 384 private static final long serialVersionUID = 5232453752276485070L; 385 386 /** This task's completer, or null if none */ 387 final CountedCompleter<?> completer; 388 /** The number of pending tasks until completion */ 389 volatile int pending; 390 391 /** 392 * Creates a new CountedCompleter with the given completer 393 * and initial pending count. 394 * 395 * @param completer this task's completer, or {@code null} if none 396 * @param initialPendingCount the initial pending count 397 */ 398 protected CountedCompleter(CountedCompleter<?> completer, 399 int initialPendingCount) { 400 this.completer = completer; 401 this.pending = initialPendingCount; 402 } 403 404 /** 405 * Creates a new CountedCompleter with the given completer 406 * and an initial pending count of zero. 407 * 408 * @param completer this task's completer, or {@code null} if none 409 */ 410 protected CountedCompleter(CountedCompleter<?> completer) { 411 this.completer = completer; 412 } 413 414 /** 415 * Creates a new CountedCompleter with no completer 416 * and an initial pending count of zero. 417 */ 418 protected CountedCompleter() { 419 this.completer = null; 420 } 421 422 /** 423 * The main computation performed by this task. 424 */ 425 public abstract void compute(); 426 427 /** 428 * Performs an action when method {@link #tryComplete} is invoked 429 * and the pending count is zero, or when the unconditional 430 * method {@link #complete} is invoked. By default, this method 431 * does nothing. You can distinguish cases by checking the 432 * identity of the given caller argument. If not equal to {@code 433 * this}, then it is typically a subtask that may contain results 434 * (and/or links to other results) to combine. 435 * 436 * @param caller the task invoking this method (which may 437 * be this task itself) 438 */ 439 public void onCompletion(CountedCompleter<?> caller) { 440 } 441 442 /** 443 * Performs an action when method {@link 444 * #completeExceptionally(Throwable)} is invoked or method {@link 445 * #compute} throws an exception, and this task has not already 446 * otherwise completed normally. On entry to this method, this task 447 * {@link ForkJoinTask#isCompletedAbnormally}. The return value 448 * of this method controls further propagation: If {@code true} 449 * and this task has a completer that has not completed, then that 450 * completer is also completed exceptionally, with the same 451 * exception as this completer. The default implementation of 452 * this method does nothing except return {@code true}. 453 * 454 * @param ex the exception 455 * @param caller the task invoking this method (which may 456 * be this task itself) 457 * @return {@code true} if this exception should be propagated to this 458 * task's completer, if one exists 459 */ 460 public boolean onExceptionalCompletion(Throwable ex, CountedCompleter<?> caller) { 461 return true; 462 } 463 464 /** 465 * Returns the completer established in this task's constructor, 466 * or {@code null} if none. 467 * 468 * @return the completer 469 */ 470 public final CountedCompleter<?> getCompleter() { 471 return completer; 472 } 473 474 /** 475 * Returns the current pending count. 476 * 477 * @return the current pending count 478 */ 479 public final int getPendingCount() { 480 return pending; 481 } 482 483 /** 484 * Sets the pending count to the given value. 485 * 486 * @param count the count 487 */ 488 public final void setPendingCount(int count) { 489 pending = count; 490 } 491 492 /** 493 * Adds (atomically) the given value to the pending count. 494 * 495 * @param delta the value to add 496 */ 497 public final void addToPendingCount(int delta) { 498 int c; 499 do {} while (!U.compareAndSwapInt(this, PENDING, c = pending, c+delta)); 500 } 501 502 /** 503 * Sets (atomically) the pending count to the given count only if 504 * it currently holds the given expected value. 505 * 506 * @param expected the expected value 507 * @param count the new value 508 * @return {@code true} if successful 509 */ 510 public final boolean compareAndSetPendingCount(int expected, int count) { 511 return U.compareAndSwapInt(this, PENDING, expected, count); 512 } 513 514 /** 515 * If the pending count is nonzero, (atomically) decrements it. 516 * 517 * @return the initial (undecremented) pending count holding on entry 518 * to this method 519 */ 520 public final int decrementPendingCountUnlessZero() { 521 int c; 522 do {} while ((c = pending) != 0 && 523 !U.compareAndSwapInt(this, PENDING, c, c - 1)); 524 return c; 525 } 526 527 /** 528 * Returns the root of the current computation; i.e., this 529 * task if it has no completer, else its completer's root. 530 * 531 * @return the root of the current computation 532 */ 533 public final CountedCompleter<?> getRoot() { 534 CountedCompleter<?> a = this, p; 535 while ((p = a.completer) != null) 536 a = p; 537 return a; 538 } 539 540 /** 541 * If the pending count is nonzero, decrements the count; 542 * otherwise invokes {@link #onCompletion(CountedCompleter)} 543 * and then similarly tries to complete this task's completer, 544 * if one exists, else marks this task as complete. 545 */ 546 public final void tryComplete() { 547 CountedCompleter<?> a = this, s = a; 548 for (int c;;) { 549 if ((c = a.pending) == 0) { 550 a.onCompletion(s); 551 if ((a = (s = a).completer) == null) { 552 s.quietlyComplete(); 553 return; 554 } 555 } 556 else if (U.compareAndSwapInt(a, PENDING, c, c - 1)) 557 return; 558 } 559 } 560 561 /** 562 * Equivalent to {@link #tryComplete} but does not invoke {@link 563 * #onCompletion(CountedCompleter)} along the completion path: 564 * If the pending count is nonzero, decrements the count; 565 * otherwise, similarly tries to complete this task's completer, if 566 * one exists, else marks this task as complete. This method may be 567 * useful in cases where {@code onCompletion} should not, or need 568 * not, be invoked for each completer in a computation. 569 */ 570 public final void propagateCompletion() { 571 CountedCompleter<?> a = this, s = a; 572 for (int c;;) { 573 if ((c = a.pending) == 0) { 574 if ((a = (s = a).completer) == null) { 575 s.quietlyComplete(); 576 return; 577 } 578 } 579 else if (U.compareAndSwapInt(a, PENDING, c, c - 1)) 580 return; 581 } 582 } 583 584 /** 585 * Regardless of pending count, invokes 586 * {@link #onCompletion(CountedCompleter)}, marks this task as 587 * complete and further triggers {@link #tryComplete} on this 588 * task's completer, if one exists. The given rawResult is 589 * used as an argument to {@link #setRawResult} before invoking 590 * {@link #onCompletion(CountedCompleter)} or marking this task 591 * as complete; its value is meaningful only for classes 592 * overriding {@code setRawResult}. This method does not modify 593 * the pending count. 594 * 595 * <p>This method may be useful when forcing completion as soon as 596 * any one (versus all) of several subtask results are obtained. 597 * However, in the common (and recommended) case in which {@code 598 * setRawResult} is not overridden, this effect can be obtained 599 * more simply using {@code quietlyCompleteRoot();}. 600 * 601 * @param rawResult the raw result 602 */ 603 public void complete(T rawResult) { 604 CountedCompleter<?> p; 605 setRawResult(rawResult); 606 onCompletion(this); 607 quietlyComplete(); 608 if ((p = completer) != null) 609 p.tryComplete(); 610 } 611 612 /** 613 * If this task's pending count is zero, returns this task; 614 * otherwise decrements its pending count and returns {@code 615 * null}. This method is designed to be used with {@link 616 * #nextComplete} in completion traversal loops. 617 * 618 * @return this task, if pending count was zero, else {@code null} 619 */ 620 public final CountedCompleter<?> firstComplete() { 621 for (int c;;) { 622 if ((c = pending) == 0) 623 return this; 624 else if (U.compareAndSwapInt(this, PENDING, c, c - 1)) 625 return null; 626 } 627 } 628 629 /** 630 * If this task does not have a completer, invokes {@link 631 * ForkJoinTask#quietlyComplete} and returns {@code null}. Or, if 632 * the completer's pending count is non-zero, decrements that 633 * pending count and returns {@code null}. Otherwise, returns the 634 * completer. This method can be used as part of a completion 635 * traversal loop for homogeneous task hierarchies: 636 * 637 * <pre> {@code 638 * for (CountedCompleter<?> c = firstComplete(); 639 * c != null; 640 * c = c.nextComplete()) { 641 * // ... process c ... 642 * }}</pre> 643 * 644 * @return the completer, or {@code null} if none 645 */ 646 public final CountedCompleter<?> nextComplete() { 647 CountedCompleter<?> p; 648 if ((p = completer) != null) 649 return p.firstComplete(); 650 else { 651 quietlyComplete(); 652 return null; 653 } 654 } 655 656 /** 657 * Equivalent to {@code getRoot().quietlyComplete()}. 658 */ 659 public final void quietlyCompleteRoot() { 660 for (CountedCompleter<?> a = this, p;;) { 661 if ((p = a.completer) == null) { 662 a.quietlyComplete(); 663 return; 664 } 665 a = p; 666 } 667 } 668 669 /** 670 * Supports ForkJoinTask exception propagation. 671 */ 672 void internalPropagateException(Throwable ex) { 673 CountedCompleter<?> a = this, s = a; 674 while (a.onExceptionalCompletion(ex, s) && 675 (a = (s = a).completer) != null && a.status >= 0 && 676 a.recordExceptionalCompletion(ex) == EXCEPTIONAL) 677 ; 678 } 679 680 /** 681 * Implements execution conventions for CountedCompleters. 682 */ 683 protected final boolean exec() { 684 compute(); 685 return false; 686 } 687 688 /** 689 * Returns the result of the computation. By default 690 * returns {@code null}, which is appropriate for {@code Void} 691 * actions, but in other cases should be overridden, almost 692 * always to return a field or function of a field that 693 * holds the result upon completion. 694 * 695 * @return the result of the computation 696 */ 697 public T getRawResult() { return null; } 698 699 /** 700 * A method that result-bearing CountedCompleters may optionally 701 * use to help maintain result data. By default, does nothing. 702 * Overrides are not recommended. However, if this method is 703 * overridden to update existing objects or fields, then it must 704 * in general be defined to be thread-safe. 705 */ 706 protected void setRawResult(T t) { } 707 708 // Unsafe mechanics 709 private static final sun.misc.Unsafe U; 710 private static final long PENDING; 711 static { 712 try { 713 U = sun.misc.Unsafe.getUnsafe(); 714 PENDING = U.objectFieldOffset 715 (CountedCompleter.class.getDeclaredField("pending")); 716 } catch (Exception e) { 717 throw new Error(e); 718 } 719 } 720 } 721