On Thu, Nov 17, 2016 at 12:03 PM, Paul Sandoz <paul.san...@oracle.com>
wrote:

>
> Perhaps consolidate the repeated mini bit set methods as package private
> static methods on AbstractCollection? Unclear where the j.u.concurrent ones
> should go though...
>

Deferred.


> It’s purely a subjective thing but i would be inclined to change the
> variable name “deathRow" to something more neutral such as “removedBitSet”.
>

It's certainly evocative!  Especially given that they may get a reprieve
from a following predicate!


> The 2 layer nested loop is quite clever, certainly twists the mind when
> first encountered. It’s arguably more readable if there are two separate,
> (not-nested) loops, but that also requires two explicit invocations of the
> action, which may perturb the performance characteristics.
>

After you've written a hundred of these loops, they start to look rather
natural/idiomatic.  I think these nested loops should be the canonical way
to implement traversals of circular buffers in any programming language.
The inner loops seem optimal.  It seems unlikely we've invented something
new here, but maybe...


> ArrayDeque
> —
>
>  188     public ArrayDeque(int numElements) {
>  189         elements = new Object[Math.max(1, numElements + 1)];
>  190     }
>
> What if Integer.MAX_VALUE is passed?
>

Now tries (and fails!) to allocate a maximal array.


>  202     public ArrayDeque(Collection<? extends E> c) {
>  203         elements = new Object[c.size() + 1];
>  204         addAll(c);
>  205     }
>
> What if c.size() returns Integer.MAX_VALUE?
>
>
Now delegates to the other constructor.


>
>  226      * Adds i and j, mod modulus.
>  227      * Precondition and postcondition: 0 <= i < modulus, 0 <= j <=
> modulus.
>  228      */
>  229     static final int add(int i, int j, int modulus) {
>
> Is that upper bound correct for j? 0 <= j < modulus
>

j renamed to distance, to emphasize asymmetry.
Although in this file, distance will never equal modulus.


>
>  317         c.forEach(e -> addLast(e));
>
> this::addLast, up to you which you prefer
>
>
Meh.  Left as is; another vote could tip to the other side.


>
>  843         public boolean tryAdvance(Consumer<? super E> action) {
>  844             if (action == null)
>  845                 throw new NullPointerException();
>  846             int t, i;
>  847             if ((t = fence) < 0) t = getFence();
>
> Is that for optimisation purposes, since the same check is also performed
> in getFence? If so that seems like overkill
>
>
done.


>
>  848             if (t == (i = cursor))
>  849                 return false;
>  850             final Object[] es;
>  851             action.accept(nonNullElementAt(es = elements, i));
>  852             cursor = inc(i, es.length);
>
> Recommend updating cursor before the action
>
>
done.


>
>  853             return true;
>  854         }
>
>
>
> Collection8Test
> —
>
>  429     public void testRemoveAfterForEachRemaining() {
>
> Are tests run by default with testImplementationDetails == true? I am
> guessing so.
>
>
We run various combinations in jtreg mode.

 * @run junit/othervm/timeout=1000 -Djsr166.testImplementationDetails=true
JSR166TestCase
 * @run junit/othervm/timeout=1000
-Djava.util.concurrent.ForkJoinPool.common.parallelism=0
-Djsr166.testImplementationDetails=true JSR166TestCase
 * @run junit/othervm/timeout=1000
-Djava.util.concurrent.ForkJoinPool.common.parallelism=1
-Djava.util.secureRandomSeed=true JSR166TestCase

The original target for these tests are the jck, and that is expected to
run with the default testImplementationDetails=false

Reply via email to