Mercurial > hg > graal-compiler
comparison src/share/vm/runtime/fprofiler.cpp @ 107:93b6525e3b82
6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
Summary: Rewrite frame::safe_for_sender and friends to be safe for collector/analyzer
Reviewed-by: dcubed, kvn
author | sgoldman |
---|---|
date | Tue, 08 Apr 2008 12:23:15 -0400 |
parents | a61af66fc99e |
children | d1605aabd0a1 |
comparison
equal
deleted
inserted
replaced
106:c9314fa4f757 | 107:93b6525e3b82 |
---|---|
922 } | 922 } |
923 } | 923 } |
924 FlatProfiler::record_thread_ticks(); | 924 FlatProfiler::record_thread_ticks(); |
925 } | 925 } |
926 | 926 |
927 void ThreadProfiler::record_interpreted_tick(frame fr, TickPosition where, int* ticks) { | 927 void ThreadProfiler::record_interpreted_tick(JavaThread* thread, frame fr, TickPosition where, int* ticks) { |
928 FlatProfiler::all_int_ticks++; | 928 FlatProfiler::all_int_ticks++; |
929 if (!FlatProfiler::full_profile()) { | 929 if (!FlatProfiler::full_profile()) { |
930 return; | 930 return; |
931 } | 931 } |
932 | 932 |
933 if (!fr.is_interpreted_frame_valid()) { | 933 if (!fr.is_interpreted_frame_valid(thread)) { |
934 // tick came at a bad time | 934 // tick came at a bad time |
935 interpreter_ticks += 1; | 935 interpreter_ticks += 1; |
936 FlatProfiler::interpreter_ticks += 1; | 936 FlatProfiler::interpreter_ticks += 1; |
937 return; | 937 return; |
938 } | 938 } |
939 | 939 |
940 methodOop method = NULL; | 940 // The frame has been fully validated so we can trust the method and bci |
941 if (fr.fp() != NULL) { | 941 |
942 method = *fr.interpreter_frame_method_addr(); | 942 methodOop method = *fr.interpreter_frame_method_addr(); |
943 } | 943 |
944 if (!Universe::heap()->is_valid_method(method)) { | |
945 // tick came at a bad time, stack frame not initialized correctly | |
946 interpreter_ticks += 1; | |
947 FlatProfiler::interpreter_ticks += 1; | |
948 return; | |
949 } | |
950 interpreted_update(method, where); | 944 interpreted_update(method, where); |
951 | 945 |
952 // update byte code table | 946 // update byte code table |
953 InterpreterCodelet* desc = Interpreter::codelet_containing(fr.pc()); | 947 InterpreterCodelet* desc = Interpreter::codelet_containing(fr.pc()); |
954 if (desc != NULL && desc->bytecode() >= 0) { | 948 if (desc != NULL && desc->bytecode() >= 0) { |
995 | 989 |
996 void ThreadProfiler::record_tick_for_running_frame(JavaThread* thread, frame fr) { | 990 void ThreadProfiler::record_tick_for_running_frame(JavaThread* thread, frame fr) { |
997 // The tick happend in real code -> non VM code | 991 // The tick happend in real code -> non VM code |
998 if (fr.is_interpreted_frame()) { | 992 if (fr.is_interpreted_frame()) { |
999 interval_data_ref()->inc_interpreted(); | 993 interval_data_ref()->inc_interpreted(); |
1000 record_interpreted_tick(fr, tp_code, FlatProfiler::bytecode_ticks); | 994 record_interpreted_tick(thread, fr, tp_code, FlatProfiler::bytecode_ticks); |
1001 return; | 995 return; |
1002 } | 996 } |
1003 | 997 |
1004 if (CodeCache::contains(fr.pc())) { | 998 if (CodeCache::contains(fr.pc())) { |
1005 interval_data_ref()->inc_compiled(); | 999 interval_data_ref()->inc_compiled(); |
1026 | 1020 |
1027 void ThreadProfiler::record_tick_for_calling_frame(JavaThread* thread, frame fr) { | 1021 void ThreadProfiler::record_tick_for_calling_frame(JavaThread* thread, frame fr) { |
1028 // The tick happend in VM code | 1022 // The tick happend in VM code |
1029 interval_data_ref()->inc_native(); | 1023 interval_data_ref()->inc_native(); |
1030 if (fr.is_interpreted_frame()) { | 1024 if (fr.is_interpreted_frame()) { |
1031 record_interpreted_tick(fr, tp_native, FlatProfiler::bytecode_ticks_stub); | 1025 record_interpreted_tick(thread, fr, tp_native, FlatProfiler::bytecode_ticks_stub); |
1032 return; | 1026 return; |
1033 } | 1027 } |
1034 if (CodeCache::contains(fr.pc())) { | 1028 if (CodeCache::contains(fr.pc())) { |
1035 record_compiled_tick(thread, fr, tp_native); | 1029 record_compiled_tick(thread, fr, tp_native); |
1036 return; | 1030 return; |