src/os/windows/vm/os_windows.cpp

changeset 7074
833b0f92429a
parent 6918
d22136881b85
child 7081
aef17e6b4abf
     1.1 --- a/src/os/windows/vm/os_windows.cpp	Wed Aug 27 09:36:55 2014 +0200
     1.2 +++ b/src/os/windows/vm/os_windows.cpp	Wed Aug 27 08:19:12 2014 -0400
     1.3 @@ -131,6 +131,12 @@
     1.4      case DLL_PROCESS_DETACH:
     1.5        if(ForceTimeHighResolution)
     1.6          timeEndPeriod(1L);
     1.7 +
     1.8 +       // Workaround for issue when a custom launcher doesn't call
     1.9 +       // DestroyJavaVM and NMT is trying to track memory when free is
    1.10 +       // called from a static destructor
    1.11 +       MemTracker::shutdown();
    1.12 +
    1.13        break;
    1.14      default:
    1.15        break;
    1.16 @@ -153,6 +159,10 @@
    1.17   return result > 0 && result < len;
    1.18  }
    1.19  
    1.20 +bool os::unsetenv(const char* name) {
    1.21 +  assert(name != NULL, "Null pointer");
    1.22 +  return (SetEnvironmentVariable(name, NULL) == TRUE);
    1.23 +}
    1.24  
    1.25  // No setuid programs under Windows.
    1.26  bool os::have_special_privileges() {
    1.27 @@ -311,15 +321,17 @@
    1.28   * So far, this method is only used by Native Memory Tracking, which is
    1.29   * only supported on Windows XP or later.
    1.30   */
    1.31 -address os::get_caller_pc(int n) {
    1.32 +
    1.33 +int os::get_native_stack(address* stack, int frames, int toSkip) {
    1.34  #ifdef _NMT_NOINLINE_
    1.35 -  n ++;
    1.36 +  toSkip ++;
    1.37  #endif
    1.38 -  address pc;
    1.39 -  if (os::Kernel32Dll::RtlCaptureStackBackTrace(n + 1, 1, (PVOID*)&pc, NULL) == 1) {
    1.40 -    return pc;
    1.41 -  }
    1.42 -  return NULL;
    1.43 +  int captured = Kernel32Dll::RtlCaptureStackBackTrace(toSkip + 1, frames,
    1.44 +    (PVOID*)stack, NULL);
    1.45 +  for (int index = captured; index < frames; index ++) {
    1.46 +    stack[index] = NULL;
    1.47 +  }
    1.48 +  return captured;
    1.49  }
    1.50  
    1.51  
    1.52 @@ -2904,7 +2916,7 @@
    1.53                                  PAGE_READWRITE);
    1.54    // If reservation failed, return NULL
    1.55    if (p_buf == NULL) return NULL;
    1.56 -  MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, mtNone, CALLER_PC);
    1.57 +  MemTracker::record_virtual_memory_reserve((address)p_buf, size_of_reserve, CALLER_PC);
    1.58    os::release_memory(p_buf, bytes + chunk_size);
    1.59  
    1.60    // we still need to round up to a page boundary (in case we are using large pages)
    1.61 @@ -2970,7 +2982,7 @@
    1.62          // need to create a dummy 'reserve' record to match
    1.63          // the release.
    1.64          MemTracker::record_virtual_memory_reserve((address)p_buf,
    1.65 -          bytes_to_release, mtNone, CALLER_PC);
    1.66 +          bytes_to_release, CALLER_PC);
    1.67          os::release_memory(p_buf, bytes_to_release);
    1.68        }
    1.69  #ifdef ASSERT
    1.70 @@ -2989,11 +3001,10 @@
    1.71    }
    1.72    // Although the memory is allocated individually, it is returned as one.
    1.73    // NMT records it as one block.
    1.74 -  address pc = CALLER_PC;
    1.75    if ((flags & MEM_COMMIT) != 0) {
    1.76 -    MemTracker::record_virtual_memory_reserve_and_commit((address)p_buf, bytes, mtNone, pc);
    1.77 +    MemTracker::record_virtual_memory_reserve_and_commit((address)p_buf, bytes, CALLER_PC);
    1.78    } else {
    1.79 -    MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, mtNone, pc);
    1.80 +    MemTracker::record_virtual_memory_reserve((address)p_buf, bytes, CALLER_PC);
    1.81    }
    1.82  
    1.83    // made it this far, success
    1.84 @@ -3191,8 +3202,7 @@
    1.85      DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
    1.86      char * res = (char *)VirtualAlloc(addr, bytes, flag, prot);
    1.87      if (res != NULL) {
    1.88 -      address pc = CALLER_PC;
    1.89 -      MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, mtNone, pc);
    1.90 +      MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, CALLER_PC);
    1.91      }
    1.92  
    1.93      return res;

mercurial