1.1 --- a/src/os/posix/vm/os_posix.cpp Wed Aug 27 09:36:55 2014 +0200 1.2 +++ b/src/os/posix/vm/os_posix.cpp Wed Aug 27 08:19:12 2014 -0400 1.3 @@ -74,21 +74,41 @@ 1.4 VMError::report_coredump_status(buffer, success); 1.5 } 1.6 1.7 -address os::get_caller_pc(int n) { 1.8 +int os::get_native_stack(address* stack, int frames, int toSkip) { 1.9 #ifdef _NMT_NOINLINE_ 1.10 - n ++; 1.11 + toSkip++; 1.12 #endif 1.13 + 1.14 + int frame_idx = 0; 1.15 + int num_of_frames; // number of frames captured 1.16 frame fr = os::current_frame(); 1.17 - while (n > 0 && fr.pc() && 1.18 - !os::is_first_C_frame(&fr) && fr.sender_pc()) { 1.19 - fr = os::get_sender_for_C_frame(&fr); 1.20 - n --; 1.21 + while (fr.pc() && frame_idx < frames) { 1.22 + if (toSkip > 0) { 1.23 + toSkip --; 1.24 + } else { 1.25 + stack[frame_idx ++] = fr.pc(); 1.26 + } 1.27 + if (fr.fp() == NULL || os::is_first_C_frame(&fr) 1.28 + ||fr.sender_pc() == NULL || fr.cb() != NULL) break; 1.29 + 1.30 + if (fr.sender_pc() && !os::is_first_C_frame(&fr)) { 1.31 + fr = os::get_sender_for_C_frame(&fr); 1.32 + } else { 1.33 + break; 1.34 + } 1.35 } 1.36 - if (n == 0) { 1.37 - return fr.pc(); 1.38 - } else { 1.39 - return NULL; 1.40 + num_of_frames = frame_idx; 1.41 + for (; frame_idx < frames; frame_idx ++) { 1.42 + stack[frame_idx] = NULL; 1.43 } 1.44 + 1.45 + return num_of_frames; 1.46 +} 1.47 + 1.48 + 1.49 +bool os::unsetenv(const char* name) { 1.50 + assert(name != NULL, "Null pointer"); 1.51 + return (::unsetenv(name) == 0); 1.52 } 1.53 1.54 int os::get_last_error() {