src/os/posix/vm/os_posix.cpp

changeset 7074
833b0f92429a
parent 6680
78bbf4d43a14
child 7535
7ae4e26cb1e0
child 8423
2988e5adeb8c
equal deleted inserted replaced
7073:4d3a43351904 7074:833b0f92429a
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 }

mercurial