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 ) {
|