예제 #1
0
  // 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;
  }
예제 #2
0
 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;
   }
 }
예제 #3
0
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();
}
예제 #4
0
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");
}