< prev index next >

src/hotspot/cpu/zero/zeroInterpreter_zero.cpp

Print this page

329 
330   // Lock if necessary
331   BasicObjectLock *monitor;
332   monitor = nullptr;
333   if (method->is_synchronized()) {
334     monitor = (BasicObjectLock*) istate->stack_base();
335     oop lockee = monitor->obj();
336     bool success = false;
337     if (LockingMode == LM_LEGACY) {
338       markWord disp = lockee->mark().set_unlocked();
339       monitor->lock()->set_displaced_header(disp);
340       success = true;
341       if (lockee->cas_set_mark(markWord::from_pointer(monitor), disp) != disp) {
342         // Is it simple recursive case?
343         if (thread->is_lock_owned((address) disp.clear_lock_bits().to_pointer())) {
344           monitor->lock()->set_displaced_header(markWord::from_pointer(nullptr));
345         } else {
346           success = false;
347         }
348       }
349       if (success) {
350         THREAD->inc_held_monitor_count();
351       }
352     }
353     if (!success) {
354       CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
355           if (HAS_PENDING_EXCEPTION)
356             goto unwind_and_return;
357     }
358   }
359 
360   // Get the signature handler
361   InterpreterRuntime::SignatureHandler *handler; {
362     address handlerAddr = method->signature_handler();
363     if (handlerAddr == nullptr) {
364       CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
365       if (HAS_PENDING_EXCEPTION)
366         goto unlock_unwind_and_return;
367 
368       handlerAddr = method->signature_handler();
369       assert(handlerAddr != nullptr, "eh?");
370     }
371     if (handlerAddr == (address) InterpreterRuntime::slow_signature_handler) {

482   thread->active_handles()->clear();
483 
484  unlock_unwind_and_return:
485 
486   // Unlock if necessary
487   if (monitor) {
488     bool success = false;
489     if (LockingMode == LM_LEGACY) {
490       BasicLock* lock = monitor->lock();
491       oop rcvr = monitor->obj();
492       monitor->set_obj(nullptr);
493       success = true;
494       markWord header = lock->displaced_header();
495       if (header.to_pointer() != nullptr) { // Check for recursive lock
496         markWord old_header = markWord::encode(lock);
497         if (rcvr->cas_set_mark(header, old_header) != old_header) {
498           monitor->set_obj(rcvr);
499           success = false;
500         }
501       }
502       if (success) {
503         THREAD->dec_held_monitor_count();
504       }
505     }
506     if (!success) {
507       InterpreterRuntime::monitorexit(monitor);
508     }
509   }
510 
511   unwind_and_return:
512 
513   // Unwind the current activation
514   thread->pop_zero_frame();
515 
516   // Pop our parameters
517   stack->set_sp(stack->sp() + method->size_of_parameters());
518 
519   // Push our result
520   if (!HAS_PENDING_EXCEPTION) {
521     BasicType type = method->result_type();
522     stack->set_sp(stack->sp() - type2size[type]);
523 
524     switch (type) {

329 
330   // Lock if necessary
331   BasicObjectLock *monitor;
332   monitor = nullptr;
333   if (method->is_synchronized()) {
334     monitor = (BasicObjectLock*) istate->stack_base();
335     oop lockee = monitor->obj();
336     bool success = false;
337     if (LockingMode == LM_LEGACY) {
338       markWord disp = lockee->mark().set_unlocked();
339       monitor->lock()->set_displaced_header(disp);
340       success = true;
341       if (lockee->cas_set_mark(markWord::from_pointer(monitor), disp) != disp) {
342         // Is it simple recursive case?
343         if (thread->is_lock_owned((address) disp.clear_lock_bits().to_pointer())) {
344           monitor->lock()->set_displaced_header(markWord::from_pointer(nullptr));
345         } else {
346           success = false;
347         }
348       }



349     }
350     if (!success) {
351       CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
352           if (HAS_PENDING_EXCEPTION)
353             goto unwind_and_return;
354     }
355   }
356 
357   // Get the signature handler
358   InterpreterRuntime::SignatureHandler *handler; {
359     address handlerAddr = method->signature_handler();
360     if (handlerAddr == nullptr) {
361       CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
362       if (HAS_PENDING_EXCEPTION)
363         goto unlock_unwind_and_return;
364 
365       handlerAddr = method->signature_handler();
366       assert(handlerAddr != nullptr, "eh?");
367     }
368     if (handlerAddr == (address) InterpreterRuntime::slow_signature_handler) {

479   thread->active_handles()->clear();
480 
481  unlock_unwind_and_return:
482 
483   // Unlock if necessary
484   if (monitor) {
485     bool success = false;
486     if (LockingMode == LM_LEGACY) {
487       BasicLock* lock = monitor->lock();
488       oop rcvr = monitor->obj();
489       monitor->set_obj(nullptr);
490       success = true;
491       markWord header = lock->displaced_header();
492       if (header.to_pointer() != nullptr) { // Check for recursive lock
493         markWord old_header = markWord::encode(lock);
494         if (rcvr->cas_set_mark(header, old_header) != old_header) {
495           monitor->set_obj(rcvr);
496           success = false;
497         }
498       }



499     }
500     if (!success) {
501       InterpreterRuntime::monitorexit(monitor);
502     }
503   }
504 
505   unwind_and_return:
506 
507   // Unwind the current activation
508   thread->pop_zero_frame();
509 
510   // Pop our parameters
511   stack->set_sp(stack->sp() + method->size_of_parameters());
512 
513   // Push our result
514   if (!HAS_PENDING_EXCEPTION) {
515     BasicType type = method->result_type();
516     stack->set_sp(stack->sp() - type2size[type]);
517 
518     switch (type) {
< prev index next >