Skip to content

Commit 1bbb3dd

Browse files
committedApr 22, 2020
String table read barrier
Replacing Collector (Scavenge) specific code in a middle of StringTable code, with more generic barrier API. Besides, the original code was not fully correct, since it was using ForwardedHeader variant that is used for Partial GC in Balanced, that is not aware of: 1) self forwarded pointer. 2) large object parallel copy protocol All other code is just renaming various ReadBarrier APIs, giving them more generic name that serves the same purpose for any kind of Weak (Clearable) Root: just updates the slot in case object is already forwarded, but does trigger a copy (keep it alive), even if in Evacuate space. This code has several more suspicious spots needing further scrutiny: 1) referring directly to Metronome and 2) reading object slots directly without using Read Barrier API (currently, probably benign because those are pre=tenured objects not subject to movement, but obviously not future-proof), but the change does the bare minimum to fix a known problem. Signed-off-by: Aleksandar Micic <amicic@ca.ibm.com>
1 parent 76a961c commit 1bbb3dd

15 files changed

+41
-59
lines changed
 

‎runtime/gc/gctable.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ J9MemoryManagerFunctions MemoryManagerFunctions = {
103103
J9MetronomeWriteBarrierJ9ClassStore,
104104
J9ReadBarrier,
105105
J9ReadBarrierJ9Class,
106-
j9gc_objaccess_monitorTableReadObject,
107-
j9gc_objaccess_monitorTableReadObjectVM,
106+
j9gc_weakRoot_readObject,
107+
j9gc_weakRoot_readObjectVM,
108108
j9gc_ext_check_is_valid_heap_object,
109109
#if defined(J9VM_GC_FINALIZATION)
110110
j9gc_get_objects_pending_finalization_count,

‎runtime/gc_base/ObjectAccessBarrier.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -2013,13 +2013,13 @@ MM_ObjectAccessBarrier::preObjectRead(J9VMThread *vmThread, J9Object *srcObject,
20132013
}
20142014

20152015
bool
2016-
MM_ObjectAccessBarrier::preMonitorTableSlotRead(J9VMThread *vmThread, j9object_t *srcAddress)
2016+
MM_ObjectAccessBarrier::preWeakRootSlotRead(J9VMThread *vmThread, j9object_t *srcAddress)
20172017
{
20182018
return true;
20192019
}
20202020

20212021
bool
2022-
MM_ObjectAccessBarrier::preMonitorTableSlotRead(J9JavaVM *vm, j9object_t *srcAddress)
2022+
MM_ObjectAccessBarrier::preWeakRootSlotRead(J9JavaVM *vm, j9object_t *srcAddress)
20232023
{
20242024
return true;
20252025
}

‎runtime/gc_base/ObjectAccessBarrier.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,8 @@ class MM_ObjectAccessBarrier : public MM_BaseVirtual
262262

263263
virtual bool preObjectRead(J9VMThread *vmThread, J9Object *srcObject, fj9object_t *srcAddress);
264264
virtual bool preObjectRead(J9VMThread *vmThread, J9Class *srcClass, j9object_t *srcAddress);
265-
virtual bool preMonitorTableSlotRead(J9VMThread *vmThread, j9object_t *srcAddress);
266-
virtual bool preMonitorTableSlotRead(J9JavaVM *vm, j9object_t *srcAddress);
265+
virtual bool preWeakRootSlotRead(J9VMThread *vmThread, j9object_t *srcAddress);
266+
virtual bool preWeakRootSlotRead(J9JavaVM *vm, j9object_t *srcAddress);
267267
virtual bool postObjectRead(J9VMThread *vmThread, J9Object *srcObject, fj9object_t *srcAddress);
268268
virtual bool postObjectRead(J9VMThread *vmThread, J9Class *srcClass, J9Object **srcAddress);
269269

‎runtime/gc_base/StringTable.cpp

+3-21
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2001, 2019 IBM Corp. and others
2+
* Copyright (c) 2001, 2020 IBM Corp. and others
33
*
44
* This program and the accompanying materials are made available under
55
* the terms of the Eclipse Public License 2.0 which accompanies this
@@ -224,16 +224,7 @@ stringComparatorFn(struct J9AVLTree *tree, struct J9AVLTreeNode *leftNode, struc
224224
stu8Ptr = *((UDATA*) (leftNode+1));
225225

226226
/* Get at the String information */
227-
right_s = *(j9object_t *)(rightNode+1);
228-
229-
if (!isMetronome) {
230-
/* Check if string was copy-forwarded. Only do this on non-metronome since metronome re-uses the FORWARDED bit */
231-
MM_ScavengerForwardedHeader forwardedHeader(right_s, extensions);
232-
J9Object* forwardedPtr = forwardedHeader.getForwardedObject();
233-
if (NULL != forwardedPtr) {
234-
right_s = forwardedPtr;
235-
}
236-
}
227+
right_s = J9WEAKROOT_OBJECT_LOAD_VM(javaVM, (j9object_t *)(rightNode+1));
237228

238229
rightLength = J9VMJAVALANGSTRING_LENGTH_VM(javaVM, right_s);
239230
right_p = J9VMJAVALANGSTRING_VALUE_VM(javaVM, right_s);
@@ -297,16 +288,7 @@ stringComparatorFn(struct J9AVLTree *tree, struct J9AVLTreeNode *leftNode, struc
297288
U_32 i = 0;
298289
bool leftCompressed = false;
299290

300-
left_s = *(j9object_t *)(leftNode+1);
301-
302-
if (!isMetronome) {
303-
/* Check if string was copy-forwarded. Only do this on non-metronome since metronome re-uses the FORWARDED bit */
304-
MM_ScavengerForwardedHeader forwardedHeader(left_s, extensions);
305-
J9Object* forwardedPtr = forwardedHeader.getForwardedObject();
306-
if (NULL != forwardedPtr) {
307-
left_s = forwardedPtr;
308-
}
309-
}
291+
left_s = J9WEAKROOT_OBJECT_LOAD_VM(javaVM, (j9object_t *)(leftNode+1));
310292

311293
leftLength = J9VMJAVALANGSTRING_LENGTH_VM(javaVM, left_s);
312294
left_p = J9VMJAVALANGSTRING_VALUE_VM(javaVM, left_s);

‎runtime/gc_base/accessBarrier.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/*******************************************************************************
3-
* Copyright (c) 1991, 2019 IBM Corp. and others
3+
* Copyright (c) 1991, 2020 IBM Corp. and others
44
*
55
* This program and the accompanying materials are made available under
66
* the terms of the Eclipse Public License 2.0 which accompanies this
@@ -733,18 +733,18 @@ J9ReadBarrierJ9Class(J9VMThread *vmThread, j9object_t *srcAddress)
733733
}
734734

735735
j9object_t
736-
j9gc_objaccess_monitorTableReadObject(J9VMThread *vmThread, j9object_t *srcAddress)
736+
j9gc_weakRoot_readObject(J9VMThread *vmThread, j9object_t *srcAddress)
737737
{
738738
MM_ObjectAccessBarrier *barrier = MM_GCExtensions::getExtensions(vmThread->javaVM)->accessBarrier;
739-
barrier->preMonitorTableSlotRead(vmThread, srcAddress);
739+
barrier->preWeakRootSlotRead(vmThread, srcAddress);
740740
return *srcAddress;
741741
}
742742

743743
j9object_t
744-
j9gc_objaccess_monitorTableReadObjectVM(J9JavaVM *vm, j9object_t *srcAddress)
744+
j9gc_weakRoot_readObjectVM(J9JavaVM *vm, j9object_t *srcAddress)
745745
{
746746
MM_ObjectAccessBarrier *barrier = MM_GCExtensions::getExtensions(vm)->accessBarrier;
747-
barrier->preMonitorTableSlotRead(vm, srcAddress);
747+
barrier->preWeakRootSlotRead(vm, srcAddress);
748748
return *srcAddress;
749749
}
750750

‎runtime/gc_base/gc_internal.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ extern J9_CFUNC void J9MetronomeWriteBarrierStore(J9VMThread *vmThread, J9Object
195195
extern J9_CFUNC void J9MetronomeWriteBarrierJ9ClassStore(J9VMThread *vmThread, J9Object *dstObject, J9Object **dstAddress, J9Object *srcObject);
196196
extern J9_CFUNC void J9ReadBarrier(J9VMThread *vmThread, fj9object_t *srcAddress);
197197
extern J9_CFUNC void J9ReadBarrierJ9Class(J9VMThread *vmThread, j9object_t *srcAddress);
198-
extern J9_CFUNC j9object_t j9gc_objaccess_monitorTableReadObject(J9VMThread *vmThread, j9object_t *srcAddress);
199-
extern J9_CFUNC j9object_t j9gc_objaccess_monitorTableReadObjectVM(J9JavaVM *vm, j9object_t *srcAddress);
198+
extern J9_CFUNC j9object_t j9gc_weakRoot_readObject(J9VMThread *vmThread, j9object_t *srcAddress);
199+
extern J9_CFUNC j9object_t j9gc_weakRoot_readObjectVM(J9JavaVM *vm, j9object_t *srcAddress);
200200
extern J9_CFUNC UDATA isStaticObjectAllocateFlags(J9JavaVM *javaVM);
201201
extern J9_CFUNC void J9FlushThreadLocalHeap(J9VMThread *vmContext);
202202
extern J9_CFUNC jvmtiIterationControl j9mm_iterate_region_objects(J9JavaVM *vm, J9PortLibrary *portLibrary, struct J9MM_IterateRegionDescriptor *region, UDATA flags, jvmtiIterationControl(*func)(J9JavaVM *vm, struct J9MM_IterateObjectDescriptor *objectDesc, void *userData), void *userData);

‎runtime/gc_modron_standard/ReadBarrierVerifier.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -219,15 +219,15 @@ MM_ReadBarrierVerifier::preObjectRead(J9VMThread *vmThread, J9Class *srcClass, j
219219
}
220220

221221
bool
222-
MM_ReadBarrierVerifier::preMonitorTableSlotRead(J9VMThread *vmThread, j9object_t *srcAddress)
222+
MM_ReadBarrierVerifier::preWeakRootSlotRead(J9VMThread *vmThread, j9object_t *srcAddress)
223223
{
224224
Assert_MM_true(vmThread->javaVM->internalVMFunctions->currentVMThread(vmThread->javaVM) == vmThread);
225225
healSlot(_extensions, srcAddress);
226226
return true;
227227
}
228228

229229
bool
230-
MM_ReadBarrierVerifier::preMonitorTableSlotRead(J9JavaVM *vm, j9object_t *srcAddress)
230+
MM_ReadBarrierVerifier::preWeakRootSlotRead(J9JavaVM *vm, j9object_t *srcAddress)
231231
{
232232
healSlot(_extensions, srcAddress);
233233
return true;

‎runtime/gc_modron_standard/ReadBarrierVerifier.hpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 1991, 2019 IBM Corp. and others
2+
* Copyright (c) 1991, 2020 IBM Corp. and others
33
*
44
* This program and the accompanying materials are made available under
55
* the terms of the Eclipse Public License 2.0 which accompanies this
@@ -59,8 +59,8 @@
5959

6060
virtual bool preObjectRead(J9VMThread *vmThread, J9Object *srcObject, fj9object_t *srcAddress);
6161
virtual bool preObjectRead(J9VMThread *vmThread, J9Class *srcClass, j9object_t *srcAddress);
62-
virtual bool preMonitorTableSlotRead(J9VMThread *vmThread, j9object_t *srcAddress);
63-
virtual bool preMonitorTableSlotRead(J9JavaVM *vm, j9object_t *srcAddress);
62+
virtual bool preWeakRootSlotRead(J9VMThread *vmThread, j9object_t *srcAddress);
63+
virtual bool preWeakRootSlotRead(J9JavaVM *vm, j9object_t *srcAddress);
6464

6565
void poisonSlot(MM_GCExtensionsBase *extensions, omrobjectptr_t *slot);
6666
void poisonJniWeakReferenceSlots(MM_EnvironmentBase *env);

‎runtime/gc_modron_standard/StandardAccessBarrier.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ MM_StandardAccessBarrier::asConstantPoolObject(J9VMThread *vmThread, J9Object* t
767767

768768
#if defined(OMR_GC_CONCURRENT_SCAVENGER)
769769
bool
770-
MM_StandardAccessBarrier::preMonitorTableSlotRead(J9VMThread *vmThread, j9object_t *srcAddress)
770+
MM_StandardAccessBarrier::preWeakRootSlotRead(J9VMThread *vmThread, j9object_t *srcAddress)
771771
{
772772
omrobjectptr_t object = (omrobjectptr_t)*srcAddress;
773773
bool const compressed = compressObjectReferences();
@@ -797,7 +797,7 @@ MM_StandardAccessBarrier::preMonitorTableSlotRead(J9VMThread *vmThread, j9object
797797
}
798798

799799
bool
800-
MM_StandardAccessBarrier::preMonitorTableSlotRead(J9JavaVM *vm, j9object_t *srcAddress)
800+
MM_StandardAccessBarrier::preWeakRootSlotRead(J9JavaVM *vm, j9object_t *srcAddress)
801801
{
802802
omrobjectptr_t object = (omrobjectptr_t)*srcAddress;
803803
bool const compressed = compressObjectReferences();

‎runtime/gc_modron_standard/StandardAccessBarrier.hpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
/*******************************************************************************
3-
* Copyright (c) 1991, 2019 IBM Corp. and others
3+
* Copyright (c) 1991, 2020 IBM Corp. and others
44
*
55
* This program and the accompanying materials are made available under
66
* the terms of the Eclipse Public License 2.0 which accompanies this
@@ -100,8 +100,8 @@ class MM_StandardAccessBarrier : public MM_ObjectAccessBarrier
100100
virtual bool preObjectRead(J9VMThread *vmThread, J9Object *srcObject, fj9object_t *srcAddress);
101101
/* off-heap slot (always non-compressed) */
102102
virtual bool preObjectRead(J9VMThread *vmThread, J9Class *srcClass, j9object_t *srcAddress);
103-
virtual bool preMonitorTableSlotRead(J9VMThread *vmThread, j9object_t *srcAddress);
104-
virtual bool preMonitorTableSlotRead(J9JavaVM *vm, j9object_t *srcAddress);
103+
virtual bool preWeakRootSlotRead(J9VMThread *vmThread, j9object_t *srcAddress);
104+
virtual bool preWeakRootSlotRead(J9JavaVM *vm, j9object_t *srcAddress);
105105
#endif
106106

107107
bool preObjectStoreImpl(J9VMThread *vmThread, J9Object *destObject, fj9object_t *destAddress, J9Object *value, bool isVolatile);

‎runtime/oti/j9accessbarrier.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -557,18 +557,18 @@ typedef struct J9IndexableObject* mm_j9array_t;
557557
#endif /* defined (J9VM_GC_ALWAYS_CALL_OBJECT_ACCESS_BARRIER) */
558558

559559
#if defined (J9VM_GC_ALWAYS_CALL_OBJECT_ACCESS_BARRIER)
560-
#define J9MONITORTABLE_OBJECT_LOAD(vmThread, objectSlot) ((j9object_t)J9VMTHREAD_JAVAVM(vmThread)->memoryManagerFunctions->j9gc_objaccess_monitorTableReadObject((vmThread), (j9object_t *)(objectSlot)))
561-
#define J9MONITORTABLE_OBJECT_LOAD_VM(javaVM, objectSlot) ((j9object_t)(javaVM)->memoryManagerFunctions->j9gc_objaccess_monitorTableReadObjectVM(javaVM, (j9object_t *)(objectSlot)))
560+
#define J9WEAKROOT_OBJECT_LOAD(vmThread, objectSlot) ((j9object_t)J9VMTHREAD_JAVAVM(vmThread)->memoryManagerFunctions->j9gc_weakRoot_readObject((vmThread), (j9object_t *)(objectSlot)))
561+
#define J9WEAKROOT_OBJECT_LOAD_VM(javaVM, objectSlot) ((j9object_t)(javaVM)->memoryManagerFunctions->j9gc_weakRoot_readObjectVM(javaVM, (j9object_t *)(objectSlot)))
562562
#else /* J9VM_GC_ALWAYS_CALL_OBJECT_ACCESS_BARRIER */
563-
#define J9MONITORTABLE_OBJECT_LOAD(vmThread, objectSlot) \
563+
#define J9WEAKROOT_OBJECT_LOAD(vmThread, objectSlot) \
564564
((J9_GC_READ_BARRIER_TYPE_NONE == (vmThread)->javaVM->gcReadBarrierType) ? \
565565
(*(j9object_t *)(objectSlot)) : \
566-
((j9object_t)J9VMTHREAD_JAVAVM(vmThread)->memoryManagerFunctions->j9gc_objaccess_monitorTableReadObject((vmThread), (j9object_t *)(objectSlot))))
566+
((j9object_t)J9VMTHREAD_JAVAVM(vmThread)->memoryManagerFunctions->j9gc_weakRoot_readObject((vmThread), (j9object_t *)(objectSlot))))
567567

568-
#define J9MONITORTABLE_OBJECT_LOAD_VM(javaVM, objectSlot) \
568+
#define J9WEAKROOT_OBJECT_LOAD_VM(javaVM, objectSlot) \
569569
((J9_GC_READ_BARRIER_TYPE_NONE == (javaVM)->gcReadBarrierType) ? \
570570
(*(j9object_t *)(objectSlot)) : \
571-
((j9object_t)(javaVM)->memoryManagerFunctions->j9gc_objaccess_monitorTableReadObjectVM(javaVM, (j9object_t *)(objectSlot))))
571+
((j9object_t)(javaVM)->memoryManagerFunctions->j9gc_weakRoot_readObjectVM(javaVM, (j9object_t *)(objectSlot))))
572572

573573
#endif /* J9VM_GC_ALWAYS_CALL_OBJECT_ACCESS_BARRIER */
574574

‎runtime/oti/j9nonbuilder.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -3963,8 +3963,8 @@ typedef struct J9MemoryManagerFunctions {
39633963
void ( *J9MetronomeWriteBarrierJ9ClassStore)(struct J9VMThread *vmThread, J9Object *dstObject, J9Object **dstAddress, J9Object *srcObject) ;
39643964
void ( *J9ReadBarrier)(struct J9VMThread *vmThread, fj9object_t *srcAddress);
39653965
void ( *J9ReadBarrierJ9Class)(struct J9VMThread *vmThread, j9object_t *srcAddress);
3966-
j9object_t ( *j9gc_objaccess_monitorTableReadObject)(struct J9VMThread *vmThread, j9object_t *srcAddress);
3967-
j9object_t ( *j9gc_objaccess_monitorTableReadObjectVM)(struct J9JavaVM *vm, j9object_t *srcAddress);
3966+
j9object_t ( *j9gc_weakRoot_readObject)(struct J9VMThread *vmThread, j9object_t *srcAddress);
3967+
j9object_t ( *j9gc_weakRoot_readObjectVM)(struct J9JavaVM *vm, j9object_t *srcAddress);
39683968
UDATA ( *j9gc_ext_check_is_valid_heap_object)(struct J9JavaVM *javaVM, j9object_t ptr, UDATA flags) ;
39693969
#if defined(J9VM_GC_FINALIZATION)
39703970
UDATA ( *j9gc_get_objects_pending_finalization_count)(struct J9JavaVM* vm) ;

‎runtime/util/jlm.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 1991, 2018 IBM Corp. and others
2+
* Copyright (c) 1991, 2020 IBM Corp. and others
33
*
44
* This program and the accompanying materials are made available under
55
* the terms of the Eclipse Public License 2.0 which accompanies this
@@ -183,7 +183,7 @@ request_MonitorJlmDump(jvmtiEnv * env, J9VMJlmDump * jlmd, jint dump_format)
183183
if (dump_format == COM_IBM_JLM_DUMP_FORMAT_TAGS) {
184184
jlong tag = 0;
185185
if (monitor->flags & J9THREAD_MONITOR_OBJECT) {
186-
j9object_t object = J9MONITORTABLE_OBJECT_LOAD(vmThread, &monitor->userData);
186+
j9object_t object = J9WEAKROOT_OBJECT_LOAD(vmThread, &monitor->userData);
187187
/* Similar to jvmtiGetTag code, but with object being of object_t type */
188188
if (object != NULL) {
189189
J9JVMTIObjectTag entry;
@@ -314,7 +314,7 @@ GetMonitorName(J9VMThread *vmThread, J9ThreadAbstractMonitor *monitor, char *nam
314314
PORT_ACCESS_FROM_VMC(vmThread);
315315

316316
if (monitor->flags & J9THREAD_MONITOR_OBJECT ) {
317-
j9object_t object = J9MONITORTABLE_OBJECT_LOAD(vmThread, &monitor->userData);
317+
j9object_t object = J9WEAKROOT_OBJECT_LOAD(vmThread, &monitor->userData);
318318
J9Class *clazz;
319319
char* objType;
320320
J9ROMClass *romClass;

‎runtime/vm/ObjectMonitor.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ objectMonitorEnterBlocking(J9VMThread *currentThread)
201201
}
202202
/* In a Concurrent GC where monitor object can *move* in a middle of GC cycle,
203203
* we need a proper barrier to get an up-to-date location of the monitor object */
204-
j9objectmonitor_t volatile *lwEA = VM_ObjectMonitor::inlineGetLockAddress(currentThread, J9MONITORTABLE_OBJECT_LOAD(currentThread, &((J9ThreadMonitor*)monitor)->userData));
204+
j9objectmonitor_t volatile *lwEA = VM_ObjectMonitor::inlineGetLockAddress(currentThread, J9WEAKROOT_OBJECT_LOAD(currentThread, &((J9ThreadMonitor*)monitor)->userData));
205205
j9objectmonitor_t lockInLoop = J9_LOAD_LOCKWORD(currentThread, lwEA);
206206
/* Change lockword from Learning to Flat if in Learning state. */
207207
while (OBJECT_HEADER_LOCK_LEARNING == (lockInLoop & (OBJECT_HEADER_LOCK_LEARNING | OBJECT_HEADER_LOCK_INFLATED))) {

‎runtime/vm/montable.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ hashMonitorCompare(void *tableEntryKey, void *userKey, void *userData)
7979
* we need a proper barrier to get an up-to-date location of the monitor object
8080
* Only access to the table entry needs the barrier. The user provided key should already have an updated location of the objects,
8181
* since a read barrier had to be executed some time prior to the construction of the key, wherever the value is read from */
82-
j9object_t tableEntryObject = J9MONITORTABLE_OBJECT_LOAD_VM((J9JavaVM *)userData, &(tableEntryMonitor->userData));
82+
j9object_t tableEntryObject = J9WEAKROOT_OBJECT_LOAD_VM((J9JavaVM *)userData, &(tableEntryMonitor->userData));
8383

8484
return tableEntryObject == (j9object_t)userMonitor->userData;
8585
}
8686

8787
void
8888
cacheObjectMonitorForLookup(J9JavaVM* vm, J9VMThread* vmStruct, J9ObjectMonitor* objectMonitor)
8989
{
90-
j9object_t object = J9MONITORTABLE_OBJECT_LOAD(vmStruct, &((J9ThreadAbstractMonitor*)(objectMonitor->monitor))->userData);
90+
j9object_t object = J9WEAKROOT_OBJECT_LOAD(vmStruct, &((J9ThreadAbstractMonitor*)(objectMonitor->monitor))->userData);
9191

9292
vmStruct->objectMonitorLookupCache[J9_OBJECT_MONITOR_LOOKUP_SLOT(object,vm)] = (j9objectmonitor_t) ((UDATA) objectMonitor);
9393
}
@@ -253,7 +253,7 @@ monitorTableAt(J9VMThread* vmStruct, j9object_t object)
253253
* with the comparison. Otherwise, we may miss to identify cache hit. Hence, we call a 'weak' read barrier (only updating slot if object already moved,
254254
* but not triggering a copy) on userData slot.
255255
*/
256-
if ((objectMonitor != NULL) && (J9MONITORTABLE_OBJECT_LOAD_VM(vm, &((J9ThreadAbstractMonitor*)objectMonitor->monitor)->userData) == object)) {
256+
if ((objectMonitor != NULL) && (J9WEAKROOT_OBJECT_LOAD_VM(vm, &((J9ThreadAbstractMonitor*)objectMonitor->monitor)->userData) == object)) {
257257
HIT();
258258
TRACE("Cache hit");
259259
Trc_VM_monitorTableAt_CacheHit_Exit(vmStruct, objectMonitor);

0 commit comments

Comments
 (0)
Please sign in to comment.