< prev index next >

src/os_cpu/windows_x86/vm/thread_windows_x86.cpp

Print this page




  31 // currently interrupted by SIGPROF
  32 bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr,
  33   void* ucontext, bool isInJava) {
  34 
  35   assert(Thread::current() == this, "caller must be current thread");
  36   return pd_get_top_frame(fr_addr, ucontext, isInJava);
  37 }
  38 
  39 bool JavaThread::pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava) {
  40   return pd_get_top_frame(fr_addr, ucontext, isInJava);
  41 }
  42 
  43 bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava) {
  44 
  45   assert(this->is_Java_thread(), "must be JavaThread");
  46 
  47   JavaThread* jt = (JavaThread *)this;
  48 
  49   // If we have a last_Java_frame, then we should use it even if
  50   // isInJava == true.  It should be more reliable than CONTEXT info.
  51   if (jt->has_last_Java_frame()) {
  52     *fr_addr = jt->pd_last_frame();
  53     return true;
  54   }
  55 
  56   // At this point, we don't have a last_Java_frame, so
  57   // we try to glean some information out of the CONTEXT
  58   // if we were running Java code when SIGPROF came in.
  59   if (isInJava) {
  60     CONTEXT* uc = (CONTEXT*)ucontext;
  61 
  62 #ifdef AMD64
  63     intptr_t* ret_fp = (intptr_t*) uc->Rbp;
  64     intptr_t* ret_sp = (intptr_t*) uc->Rsp;
  65     ExtendedPC addr = ExtendedPC((address)uc->Rip);
  66 #else
  67     intptr_t* ret_fp = (intptr_t*) uc->Ebp;
  68     intptr_t* ret_sp = (intptr_t*) uc->Esp;
  69     ExtendedPC addr = ExtendedPC((address)uc->Eip);
  70 #endif // AMD64
  71     if (addr.pc() == NULL || ret_sp == NULL ) {




  31 // currently interrupted by SIGPROF
  32 bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr,
  33   void* ucontext, bool isInJava) {
  34 
  35   assert(Thread::current() == this, "caller must be current thread");
  36   return pd_get_top_frame(fr_addr, ucontext, isInJava);
  37 }
  38 
  39 bool JavaThread::pd_get_top_frame_for_profiling(frame* fr_addr, void* ucontext, bool isInJava) {
  40   return pd_get_top_frame(fr_addr, ucontext, isInJava);
  41 }
  42 
  43 bool JavaThread::pd_get_top_frame(frame* fr_addr, void* ucontext, bool isInJava) {
  44 
  45   assert(this->is_Java_thread(), "must be JavaThread");
  46 
  47   JavaThread* jt = (JavaThread *)this;
  48 
  49   // If we have a last_Java_frame, then we should use it even if
  50   // isInJava == true.  It should be more reliable than CONTEXT info.
  51   if (jt->has_last_Java_frame() && jt->frame_anchor()->walkable()) {
  52     *fr_addr = jt->pd_last_frame();
  53     return true;
  54   }
  55 
  56   // At this point, we don't have a last_Java_frame, so
  57   // we try to glean some information out of the CONTEXT
  58   // if we were running Java code when SIGPROF came in.
  59   if (isInJava) {
  60     CONTEXT* uc = (CONTEXT*)ucontext;
  61 
  62 #ifdef AMD64
  63     intptr_t* ret_fp = (intptr_t*) uc->Rbp;
  64     intptr_t* ret_sp = (intptr_t*) uc->Rsp;
  65     ExtendedPC addr = ExtendedPC((address)uc->Rip);
  66 #else
  67     intptr_t* ret_fp = (intptr_t*) uc->Ebp;
  68     intptr_t* ret_sp = (intptr_t*) uc->Esp;
  69     ExtendedPC addr = ExtendedPC((address)uc->Eip);
  70 #endif // AMD64
  71     if (addr.pc() == NULL || ret_sp == NULL ) {


< prev index next >