// Compute the StackLock* based on a locked java_near static StackLock* from_java_oop(JavaOop* java_oop) { #ifdef AZZERT JavaNear::Raw java_near = java_oop->klass(); GUARANTEE(java_near().is_locked(), "Must be on stack"); #endif return ((StackLock*) java_oop->klass()) - 1; }
static ReturnOop waiters_from_java_oop(JavaOop* java_oop) { JavaNear::Raw java_near = java_oop->klass(); if (!java_near().is_locked()) { return NULL; } else { return ((StackLock*)(((StackLock*) java_oop->klass()) - 1))->_waiters; } }
void StackLock::set_waiters(Thread* thread) { GUARANTEE(!thread->is_null(), "Sanity"); #ifdef AZZERT StackLock* stack_lock = thread->wait_stack_lock(); GUARANTEE(stack_lock != NULL, "null stack lock"); #endif // Don't use JavaNear since this is a stack lock JavaNear::Raw n = java_near(); n().set_lock(JavaNear::waiters_value); _waiters = thread->obj(); }
void StackLock::lock(Thread* thread, JavaOop *obj) { AllocationDisabler no_allocation; // May not necessarily be the current thread GUARANTEE(owner() == NULL || owner() == obj->obj(), "Sanity Check"); GUARANTEE(thread->is_on_stack((address)this), "Sanity check"); JavaNear::Raw real_near = obj->klass(); GUARANTEE(!real_near().is_locked(), "Sanity check"); // Must not use JavaNear for stack nears. JavaNear::Raw stack_near = java_near(&real_near); stack_near().set_lock(JavaNear::locked_value); // Object is unlocked, so we're free to lock it. set_owner(obj); set_thread(thread); set_real_java_near(&real_near); _waiters = NULL; obj->set_klass(&stack_near); GUARANTEE(Synchronizer::is_locked_by(obj, thread), "Sanity check"); }