src/os/posix/vm/os_posix.cpp

changeset 7074
833b0f92429a
parent 6680
78bbf4d43a14
child 7535
7ae4e26cb1e0
child 8423
2988e5adeb8c
     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() {

mercurial