private void externalSubmit(ForkJoinTask<?> task){
  int r;
  if ((r=ThreadLocalRandom.getProbe()) == 0) {
    ThreadLocalRandom.localInit();
    r=ThreadLocalRandom.getProbe();
  }
  for (; ; ) {
    WorkQueue[] ws;
    WorkQueue q;
    int rs, m, k;
    boolean move=false;
    if ((rs=runState) < 0) {
      tryTerminate(false,false);
      throw new RejectedExecutionException();
    }
 else     if ((rs & STARTED) == 0 || ((ws=workQueues) == null || (m=ws.length - 1) < 0)) {
      int ns=0;
      rs=lockRunState();
      try {
        if ((rs & STARTED) == 0) {
          U.compareAndSwapObject(this,STEALCOUNTER,null,new AtomicLong());
          int p=config & SMASK;
          int n=(p > 1) ? p - 1 : 1;
          n|=n >>> 1;
          n|=n >>> 2;
          n|=n >>> 4;
          n|=n >>> 8;
          n|=n >>> 16;
          n=(n + 1) << 1;
          workQueues=new WorkQueue[n];
          ns=STARTED;
        }
      }
  finally {
        unlockRunState(rs,(rs & ~RSLOCK) | ns);
      }
    }
 else     if ((q=ws[k=r & m & SQMASK]) != null) {
      if (q.qlock == 0 && U.compareAndSwapInt(q,QLOCK,0,1)) {
        ForkJoinTask<?>[] a=q.array;
        int s=q.top;
        boolean submitted=false;
        try {
          if ((a != null && a.length > s + 1 - q.base) || (a=q.growArray()) != null) {
            int j=(((a.length - 1) & s) << ASHIFT) + ABASE;
            U.putOrderedObject(a,j,task);
            U.putOrderedInt(q,QTOP,s + 1);
            submitted=true;
          }
        }
  finally {
          U.compareAndSwapInt(q,QLOCK,1,0);
        }
        if (submitted) {
          signalWork(ws,q);
          return;
        }
      }
      move=true;
    }
 else     if (((rs=runState) & RSLOCK) == 0) {
      q=new WorkQueue(this,null);
      q.hint=r;
      q.config=k | SHARED_QUEUE;
      q.scanState=INACTIVE;
      rs=lockRunState();
      if (rs > 0 && (ws=workQueues) != null && k < ws.length && ws[k] == null)       ws[k]=q;
      unlockRunState(rs,rs & ~RSLOCK);
    }
 else     move=true;
    if (move)     r=ThreadLocalRandom.advanceProbe(r);
  }
}

private void externalSubmit ( ForkJoinTask < ? > task ) { int r ; if ( ( r = ThreadLocalRandom . getProbe ( ) ) == 0 ) { ThreadLocalRandom . localInit ( ) ; r = ThreadLocalRandom . getProbe ( ) ; } for ( ; ; ) { WorkQueue [ ] ws ; WorkQueue q ; int rs , m , k ; boolean move = false ; if ( ( rs = runState ) < 0 ) { tryTerminate ( false , false ) ; throw new RejectedExecutionException ( ) ; } else if ( ( rs & STARTED ) == 0 || ( ( ws = workQueues ) == null || ( m = ws . length - 1 ) < 0 ) ) { int ns = 0 ; rs = lockRunState ( ) ; try { if ( ( rs & STARTED ) == 0 ) { U . compareAndSwapObject ( this , STEALCOUNTER , null , new AtomicLong ( ) ) ; int p = config & SMASK ; int n = ( p > 1 ) ? p - 1 : 1 ; n |= n > > > 1 ; n |= n > > > 2 ; n |= n > > > 4 ; n |= n > > > 8 ; n |= n > > > 16 ; n = ( n + 1 ) << 1 ; workQueues = new WorkQueue [ n ] ; ns = STARTED ; } } finally { unlockRunState ( rs , ( rs & ~ RSLOCK ) | ns ) ; } } else if ( ( q = ws [ k = r & m & SQMASK ] ) != null ) { if ( q . qlock == 0 && U . compareAndSwapInt ( q , QLOCK , 0 , 1 ) ) { ForkJoinTask < ? > [ ] a = q . array ; int s = q . top ; boolean submitted = false ; try { if ( ( a != null && a . length > s + 1 - q . base ) || ( a = q . growArray ( ) ) != null ) { int j = ( ( ( a . length - 1 ) & s ) << ASHIFT ) + ABASE ; U . putOrderedObject ( a , j , task ) ; U . putOrderedInt ( q , QTOP , s + 1 ) ; submitted = true ; } } finally { U . compareAndSwapInt ( q , QLOCK , 1 , 0 ) ; } if ( submitted ) { signalWork ( ws , q ) ; return ; } } move = true ; } else if ( ( ( rs = runState ) & RSLOCK ) == 0 ) { q = new WorkQueue ( this , null ) ; q . hint = r ; q . config = k | SHARED_QUEUE ; q . scanState = INACTIVE ; rs = lockRunState ( ) ; if ( rs > 0 && ( ws = workQueues ) != null && k < ws . length && ws [ k ] == null ) ws [ k ] = q ; unlockRunState ( rs , rs & ~ RSLOCK ) ; } else move = true ; if ( move ) r = ThreadLocalRandom . advanceProbe ( r ) ; } }
full version of externalpush , handling uncommon cases , as well as performing secondary initialization upon the first submission of the first task to the pool . it also detects first submission by an external thread and creates a new shared queue if the one at index if empty or contended .
