840 |
|
a[(al - 1) & s] = task; // relaxed writes OK |
841 |
|
top = s + 1; |
842 |
|
ForkJoinPool p = pool; |
843 |
< |
U.storeFence(); // ensure fields written before use |
843 |
> |
U.storeFence(); // ensure fields written |
844 |
|
if ((d = b - s) == 0 && p != null) |
845 |
|
p.signalWork(); |
846 |
|
else if (al + d == 1) |
891 |
|
if (t != null && |
892 |
|
U.compareAndSwapObject(a, offset, t, null)) { |
893 |
|
top = s; |
894 |
– |
U.storeFence(); |
894 |
|
return t; |
895 |
|
} |
896 |
|
} |
973 |
|
long offset = ((long)index << ASHIFT) + ABASE; |
974 |
|
if (U.compareAndSwapObject(a, offset, task, null)) { |
975 |
|
top = s; |
977 |
– |
U.storeFence(); |
976 |
|
return true; |
977 |
|
} |
978 |
|
} |
1177 |
|
if (s + 1 == top) { // pop |
1178 |
|
if (U.compareAndSwapObject(a, offset, t, null)) { |
1179 |
|
top = s; |
1182 |
– |
U.storeFence(); |
1180 |
|
removed = true; |
1181 |
|
} |
1182 |
|
} |
1193 |
|
else if (t.status < 0 && s + 1 == top) { |
1194 |
|
if (U.compareAndSwapObject(a, offset, t, null)) { |
1195 |
|
top = s; |
1199 |
– |
U.storeFence(); |
1196 |
|
} |
1197 |
|
break; // was cancelled |
1198 |
|
} |
1239 |
|
else if (U.compareAndSwapObject(a, offset, |
1240 |
|
t, null)) { |
1241 |
|
top = s - 1; |
1246 |
– |
U.storeFence(); |
1242 |
|
return t; |
1243 |
|
} |
1244 |
|
break; |
1726 |
|
* @param r random seed |
1727 |
|
*/ |
1728 |
|
private void tryReactivate(WorkQueue w, WorkQueue[] ws, int r) { |
1729 |
< |
long c; int sp, wl, m; WorkQueue v; |
1729 |
> |
long c; int sp, wl; WorkQueue v; |
1730 |
|
if ((sp = (int)(c = ctl)) != 0 && w != null && |
1731 |
|
ws != null && (wl = ws.length) > 0 && |
1732 |
< |
((m = wl - 1) & ((sp ^ r) >>> 16)) <= 1 && |
1733 |
< |
(v = ws[m & sp]) != null) { |
1732 |
> |
((sp ^ r) & SS_SEQ) == 0 && |
1733 |
> |
(v = ws[(wl - 1) & sp]) != null) { |
1734 |
|
long nc = (v.stackPred & SP_MASK) | (UC_MASK & (c + AC_UNIT)); |
1735 |
|
int ns = sp & ~UNSIGNALLED; |
1736 |
|
if (w.scanState < 0 && |