72 } |
72 } |
73 } |
73 } |
74 VMError::report_coredump_status(buffer, success); |
74 VMError::report_coredump_status(buffer, success); |
75 } |
75 } |
76 |
76 |
77 address os::get_caller_pc(int n) { |
77 int os::get_native_stack(address* stack, int frames, int toSkip) { |
78 #ifdef _NMT_NOINLINE_ |
78 #ifdef _NMT_NOINLINE_ |
79 n ++; |
79 toSkip++; |
80 #endif |
80 #endif |
|
81 |
|
82 int frame_idx = 0; |
|
83 int num_of_frames; // number of frames captured |
81 frame fr = os::current_frame(); |
84 frame fr = os::current_frame(); |
82 while (n > 0 && fr.pc() && |
85 while (fr.pc() && frame_idx < frames) { |
83 !os::is_first_C_frame(&fr) && fr.sender_pc()) { |
86 if (toSkip > 0) { |
84 fr = os::get_sender_for_C_frame(&fr); |
87 toSkip --; |
85 n --; |
88 } else { |
86 } |
89 stack[frame_idx ++] = fr.pc(); |
87 if (n == 0) { |
90 } |
88 return fr.pc(); |
91 if (fr.fp() == NULL || os::is_first_C_frame(&fr) |
89 } else { |
92 ||fr.sender_pc() == NULL || fr.cb() != NULL) break; |
90 return NULL; |
93 |
91 } |
94 if (fr.sender_pc() && !os::is_first_C_frame(&fr)) { |
|
95 fr = os::get_sender_for_C_frame(&fr); |
|
96 } else { |
|
97 break; |
|
98 } |
|
99 } |
|
100 num_of_frames = frame_idx; |
|
101 for (; frame_idx < frames; frame_idx ++) { |
|
102 stack[frame_idx] = NULL; |
|
103 } |
|
104 |
|
105 return num_of_frames; |
|
106 } |
|
107 |
|
108 |
|
109 bool os::unsetenv(const char* name) { |
|
110 assert(name != NULL, "Null pointer"); |
|
111 return (::unsetenv(name) == 0); |
92 } |
112 } |
93 |
113 |
94 int os::get_last_error() { |
114 int os::get_last_error() { |
95 return errno; |
115 return errno; |
96 } |
116 } |