Skip to content

Commit f2a305d

Browse files
authored
Merge pull request #18652 from LinHu2016/v0.43.0-release
(0.43) Fix PowerPC specific issues
2 parents 74e68ce + fe1cbf3 commit f2a305d

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

runtime/vm/ContinuationHelpers.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ synchronizeWithConcurrentGCScan(J9VMThread *currentThread, j9object_t continuati
152152
{
153153
ContinuationState oldContinuationState = 0;
154154
ContinuationState returnContinuationState = 0;
155+
155156
/* Set pending state and carrier id, GC need to distinguish between fully mounted (don't scan) vs pending to be mounted (do scan) cases. */
156157
do {
157158
oldContinuationState = *continuationStatePtr;
@@ -167,10 +168,11 @@ synchronizeWithConcurrentGCScan(J9VMThread *currentThread, j9object_t continuati
167168
* but only up to small finite number of times.
168169
*/
169170
do {
170-
if (VM_ContinuationHelpers::isConcurrentlyScanned(returnContinuationState)) {
171+
oldContinuationState = *continuationStatePtr;
172+
if (VM_ContinuationHelpers::isConcurrentlyScanned(oldContinuationState)) {
171173
omrthread_monitor_enter(currentThread->publicFlagsMutex);
172174
/* Wait till potentially concurrent GC scans are complete */
173-
do {
175+
for(;;) {
174176
oldContinuationState = *continuationStatePtr;
175177
if (VM_ContinuationHelpers::isConcurrentlyScanned(oldContinuationState)) {
176178
PUSH_OBJECT_IN_SPECIAL_FRAME(currentThread, continuationObject);
@@ -183,20 +185,21 @@ synchronizeWithConcurrentGCScan(J9VMThread *currentThread, j9object_t continuati
183185
continuationObject = POP_OBJECT_IN_SPECIAL_FRAME(currentThread);
184186
/* Object might have moved - update its address and the address of the state slot. */
185187
continuationStatePtr = VM_ContinuationHelpers::getContinuationStateAddress(currentThread, continuationObject);
186-
continue;
188+
} else {
189+
break;
187190
}
188-
} while (false);
191+
}
189192
omrthread_monitor_exit(currentThread->publicFlagsMutex);
190193
}
191194
/* Remove pending state */
192-
oldContinuationState = *continuationStatePtr;
193195
Assert_VM_true(VM_ContinuationHelpers::isMountedWithCarrierThread(oldContinuationState, currentThread));
194196
Assert_VM_true(VM_ContinuationHelpers::isPendingToBeMounted(oldContinuationState));
195197
ContinuationState newContinuationState = oldContinuationState;
196198
VM_ContinuationHelpers::resetPendingState(&newContinuationState);
197199
returnContinuationState = VM_AtomicSupport::lockCompareExchange(continuationStatePtr, oldContinuationState, newContinuationState);
198200
} while (oldContinuationState != returnContinuationState);
199201
Assert_VM_false(VM_ContinuationHelpers::isPendingToBeMounted(*continuationStatePtr));
202+
Assert_VM_false(VM_ContinuationHelpers::isConcurrentlyScanned(*continuationStatePtr));
200203

201204
return continuationObject;
202205
}

0 commit comments

Comments
 (0)