equal
deleted
inserted
replaced
974 |
974 |
975 // template code: |
975 // template code: |
976 // |
976 // |
977 // markWord displaced_header = obj->mark().set_unlocked(); |
977 // markWord displaced_header = obj->mark().set_unlocked(); |
978 // monitor->lock()->set_displaced_header(displaced_header); |
978 // monitor->lock()->set_displaced_header(displaced_header); |
979 // if (Atomic::cmpxchg(/*ex=*/monitor, /*addr*/obj->mark_addr(), /*cmp*/displaced_header) == displaced_header) { |
979 // if (Atomic::cmpxchg(/*addr*/obj->mark_addr(), /*cmp*/displaced_header, /*ex=*/monitor) == displaced_header) { |
980 // // We stored the monitor address into the object's mark word. |
980 // // We stored the monitor address into the object's mark word. |
981 // } else if (THREAD->is_lock_owned((address)displaced_header)) |
981 // } else if (THREAD->is_lock_owned((address)displaced_header)) |
982 // // Simple recursive case. |
982 // // Simple recursive case. |
983 // monitor->lock()->set_displaced_header(NULL); |
983 // monitor->lock()->set_displaced_header(NULL); |
984 // } else { |
984 // } else { |
1009 |
1009 |
1010 // Initialize the box (Must happen before we update the object mark!). |
1010 // Initialize the box (Must happen before we update the object mark!). |
1011 z_stg(displaced_header, BasicObjectLock::lock_offset_in_bytes() + |
1011 z_stg(displaced_header, BasicObjectLock::lock_offset_in_bytes() + |
1012 BasicLock::displaced_header_offset_in_bytes(), monitor); |
1012 BasicLock::displaced_header_offset_in_bytes(), monitor); |
1013 |
1013 |
1014 // if (Atomic::cmpxchg(/*ex=*/monitor, /*addr*/obj->mark_addr(), /*cmp*/displaced_header) == displaced_header) { |
1014 // if (Atomic::cmpxchg(/*addr*/obj->mark_addr(), /*cmp*/displaced_header, /*ex=*/monitor) == displaced_header) { |
1015 |
1015 |
1016 // Store stack address of the BasicObjectLock (this is monitor) into object. |
1016 // Store stack address of the BasicObjectLock (this is monitor) into object. |
1017 add2reg(object_mark_addr, oopDesc::mark_offset_in_bytes(), object); |
1017 add2reg(object_mark_addr, oopDesc::mark_offset_in_bytes(), object); |
1018 |
1018 |
1019 z_csg(displaced_header, monitor, 0, object_mark_addr); |
1019 z_csg(displaced_header, monitor, 0, object_mark_addr); |
1080 // template code: |
1080 // template code: |
1081 // |
1081 // |
1082 // if ((displaced_header = monitor->displaced_header()) == NULL) { |
1082 // if ((displaced_header = monitor->displaced_header()) == NULL) { |
1083 // // Recursive unlock. Mark the monitor unlocked by setting the object field to NULL. |
1083 // // Recursive unlock. Mark the monitor unlocked by setting the object field to NULL. |
1084 // monitor->set_obj(NULL); |
1084 // monitor->set_obj(NULL); |
1085 // } else if (Atomic::cmpxchg(displaced_header, obj->mark_addr(), monitor) == monitor) { |
1085 // } else if (Atomic::cmpxchg(obj->mark_addr(), monitor, displaced_header) == monitor) { |
1086 // // We swapped the unlocked mark in displaced_header into the object's mark word. |
1086 // // We swapped the unlocked mark in displaced_header into the object's mark word. |
1087 // monitor->set_obj(NULL); |
1087 // monitor->set_obj(NULL); |
1088 // } else { |
1088 // } else { |
1089 // // Slow path. |
1089 // // Slow path. |
1090 // InterpreterRuntime::monitorexit(THREAD, monitor); |
1090 // InterpreterRuntime::monitorexit(THREAD, monitor); |
1121 MacroAssembler::load_and_test_long(displaced_header, |
1121 MacroAssembler::load_and_test_long(displaced_header, |
1122 Address(monitor, BasicObjectLock::lock_offset_in_bytes() + |
1122 Address(monitor, BasicObjectLock::lock_offset_in_bytes() + |
1123 BasicLock::displaced_header_offset_in_bytes())); |
1123 BasicLock::displaced_header_offset_in_bytes())); |
1124 z_bre(done); // displaced_header == 0 -> goto done |
1124 z_bre(done); // displaced_header == 0 -> goto done |
1125 |
1125 |
1126 // } else if (Atomic::cmpxchg(displaced_header, obj->mark_addr(), monitor) == monitor) { |
1126 // } else if (Atomic::cmpxchg(obj->mark_addr(), monitor, displaced_header) == monitor) { |
1127 // // We swapped the unlocked mark in displaced_header into the object's mark word. |
1127 // // We swapped the unlocked mark in displaced_header into the object's mark word. |
1128 // monitor->set_obj(NULL); |
1128 // monitor->set_obj(NULL); |
1129 |
1129 |
1130 // If we still have a lightweight lock, unlock the object and be done. |
1130 // If we still have a lightweight lock, unlock the object and be done. |
1131 |
1131 |