} UNSAFE_END UNSAFE_ENTRY(void, Unsafe_PutObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { oop x = JNIHandles::resolve(x_h); oop p = JNIHandles::resolve(obj); if (UseCompressedOops) { oop_store((narrowOop*)index_oop_from_field_offset_long(p, offset), x); } else { oop_store((oop*)index_oop_from_field_offset_long(p, offset), x); } } UNSAFE_END
} UNSAFE_END UNSAFE_ENTRY(void, Unsafe_PutObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { oop x = JNIHandles::resolve(x_h); oop p = JNIHandles::resolve(obj); void* addr = index_oop_from_field_offset_long(p, offset); OrderAccess::release(); if (UseCompressedOops) { oop_store((narrowOop*)addr, x); } else { oop_store((oop*)addr, x); } OrderAccess::fence(); } UNSAFE_END
template <class T> inline void oop_store(T* p, oop v) { if (always_do_update_barrier) { oop_store((volatile T*)p, v); } else { update_barrier_set_pre(p, v); oopDesc::encode_store_heap_oop(p, v); update_barrier_set(p, v); } }
inline void oop_store_without_check(oop* p, oop v) { // XXX YSR FIX ME!!! if (always_do_update_barrier) { oop_store(p, v); } else { assert(!Universe::heap()->barrier_set()->write_ref_needs_barrier(p, v), "oop store without store check failed"); *p = v; } }
// When it absolutely has to get there. template <class T> inline void oop_store_without_check(volatile T* p, oop v) { // XXX YSR FIX ME!!! if (always_do_update_barrier) { oop_store(p, v); } else { assert(!Universe::heap()->barrier_set()->write_ref_needs_barrier((T*)p, v), "oop store without store check failed"); oopDesc::release_encode_store_heap_oop(p, v); } }
// When it absolutely has to get there. inline void oop_store_without_check(volatile oop* p, oop v) { // XXX YSR FIX ME!!! if (always_do_update_barrier) { oop_store(p, v); } else { assert(!Universe::heap()->barrier_set()-> write_ref_needs_barrier((oop *)p, v), "oop store without store check failed"); OrderAccess::release_store_ptr(p, v); } }
template <class T> void oop_store(T* p, oop v) { if (always_do_update_barrier) { oop_store((volatile T*)p, v); } else { update_barrier_set_pre(p, v); oopDesc::encode_store_heap_oop(p, v); // always_do_update_barrier == false => // Either we are at a safepoint (in GC) or CMS is not used. In both // cases it's unnecessary to mark the card as dirty with release sematics. update_barrier_set((void*)p, v, false /* release */); // cast away type } }
void set_f1(oop f1) { oop existing_f1 = _f1; // read once assert(existing_f1 == NULL || existing_f1 == f1, "illegal field change"); oop_store(&_f1, f1); }
inline void oopDesc::release_obj_field_put(int offset, oop value) { oop_store((volatile oop*)obj_field_addr(offset), value); }
inline void oopDesc::obj_field_put(int offset, oop value) { oop_store(obj_field_addr(offset), value); }
void set_component_mirror(oop m) { oop_store((oop*) &_component_mirror, m); }
void obj_at_put(int index, oop value) { oop_store(obj_at_addr(index), value); }
inline void oopDesc::release_obj_field_put(int offset, oop value) { UseCompressedOops ? oop_store((volatile narrowOop*)obj_field_addr<narrowOop>(offset), value) : oop_store((volatile oop*) obj_field_addr<oop>(offset), value); }
inline void oopDesc::obj_field_put(int offset, oop value) { UseCompressedOops ? oop_store(obj_field_addr<narrowOop>(offset), value) : oop_store(obj_field_addr<oop>(offset), value); }
void set_f1(oop f1) { assert(_f1 == NULL || _f1 == f1, "illegal field change"); oop_store(&_f1, f1); }