8256367: [windows] Better logging for some system calls
Reviewed-by: iklam
This commit is contained in:
parent
1e9a432d59
commit
298bce1d92
@ -178,6 +178,91 @@ static inline double fileTimeAsDouble(FILETIME* time) {
|
||||
|
||||
// Implementation of os
|
||||
|
||||
#define RANGE_FORMAT "[" PTR_FORMAT "-" PTR_FORMAT ")"
|
||||
#define RANGE_FORMAT_ARGS(p, len) p2i(p), p2i((address)p + len)
|
||||
|
||||
// A number of wrappers for more frequently used system calls, to add standard logging.
|
||||
|
||||
struct PreserveLastError {
|
||||
const DWORD v;
|
||||
PreserveLastError() : v(::GetLastError()) {}
|
||||
~PreserveLastError() { ::SetLastError(v); }
|
||||
};
|
||||
|
||||
// Logging wrapper for VirtualAlloc
|
||||
static LPVOID virtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) {
|
||||
LPVOID result = ::VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect);
|
||||
if (result != NULL) {
|
||||
log_trace(os)("VirtualAlloc(" PTR_FORMAT ", " SIZE_FORMAT ", %x, %x) returned " PTR_FORMAT "%s.",
|
||||
p2i(lpAddress), dwSize, flAllocationType, flProtect, p2i(result),
|
||||
((lpAddress != NULL && result != lpAddress) ? " <different base!>" : ""));
|
||||
} else {
|
||||
PreserveLastError ple;
|
||||
log_info(os)("VirtualAlloc(" PTR_FORMAT ", " SIZE_FORMAT ", %x, %x) failed (%u).",
|
||||
p2i(lpAddress), dwSize, flAllocationType, flProtect, ple.v);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Logging wrapper for VirtualFree
|
||||
static BOOL virtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) {
|
||||
BOOL result = ::VirtualFree(lpAddress, dwSize, dwFreeType);
|
||||
if (result != FALSE) {
|
||||
log_trace(os)("VirtualFree(" PTR_FORMAT ", " SIZE_FORMAT ", %x) succeeded",
|
||||
p2i(lpAddress), dwSize, dwFreeType);
|
||||
} else {
|
||||
PreserveLastError ple;
|
||||
log_info(os)("VirtualFree(" PTR_FORMAT ", " SIZE_FORMAT ", %x) failed (%u).",
|
||||
p2i(lpAddress), dwSize, dwFreeType, ple.v);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Logging wrapper for VirtualAllocExNuma
|
||||
static LPVOID virtualAllocExNuma(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType,
|
||||
DWORD flProtect, DWORD nndPreferred) {
|
||||
LPVOID result = ::VirtualAllocExNuma(hProcess, lpAddress, dwSize, flAllocationType, flProtect, nndPreferred);
|
||||
if (result != NULL) {
|
||||
log_trace(os)("VirtualAllocExNuma(" PTR_FORMAT ", " SIZE_FORMAT ", %x, %x, %x) returned " PTR_FORMAT "%s.",
|
||||
p2i(lpAddress), dwSize, flAllocationType, flProtect, nndPreferred, p2i(result),
|
||||
((lpAddress != NULL && result != lpAddress) ? " <different base!>" : ""));
|
||||
} else {
|
||||
PreserveLastError ple;
|
||||
log_info(os)("VirtualAllocExNuma(" PTR_FORMAT ", " SIZE_FORMAT ", %x, %x, %x) failed (%u).",
|
||||
p2i(lpAddress), dwSize, flAllocationType, flProtect, nndPreferred, ple.v);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Logging wrapper for MapViewOfFileEx
|
||||
static LPVOID mapViewOfFileEx(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh,
|
||||
DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap, LPVOID lpBaseAddress) {
|
||||
LPVOID result = ::MapViewOfFileEx(hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh,
|
||||
dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress);
|
||||
if (result != NULL) {
|
||||
log_trace(os)("MapViewOfFileEx(" PTR_FORMAT ", " SIZE_FORMAT ") returned " PTR_FORMAT "%s.",
|
||||
p2i(lpBaseAddress), dwNumberOfBytesToMap, p2i(result),
|
||||
((lpBaseAddress != NULL && result != lpBaseAddress) ? " <different base!>" : ""));
|
||||
} else {
|
||||
PreserveLastError ple;
|
||||
log_info(os)("MapViewOfFileEx(" PTR_FORMAT ", " SIZE_FORMAT ") failed (%u).",
|
||||
p2i(lpBaseAddress), dwNumberOfBytesToMap, ple.v);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Logging wrapper for UnmapViewOfFile
|
||||
static BOOL unmapViewOfFile(LPCVOID lpBaseAddress) {
|
||||
BOOL result = ::UnmapViewOfFile(lpBaseAddress);
|
||||
if (result != FALSE) {
|
||||
log_trace(os)("UnmapViewOfFile(" PTR_FORMAT ") succeeded", p2i(lpBaseAddress));
|
||||
} else {
|
||||
PreserveLastError ple;
|
||||
log_info(os)("UnmapViewOfFile(" PTR_FORMAT ") failed (%u).", p2i(lpBaseAddress), ple.v);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool os::unsetenv(const char* name) {
|
||||
assert(name != NULL, "Null pointer");
|
||||
return (SetEnvironmentVariable(name, NULL) == TRUE);
|
||||
@ -340,7 +425,6 @@ int os::get_native_stack(address* stack, int frames, int toSkip) {
|
||||
return captured;
|
||||
}
|
||||
|
||||
|
||||
// os::current_stack_base()
|
||||
//
|
||||
// Returns the base of the stack, which is the stack's
|
||||
@ -2900,7 +2984,7 @@ static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags,
|
||||
// Overflowed.
|
||||
return NULL;
|
||||
}
|
||||
p_buf = (char *) VirtualAlloc(addr,
|
||||
p_buf = (char *) virtualAlloc(addr,
|
||||
size_of_reserve, // size of Reserve
|
||||
MEM_RESERVE,
|
||||
PAGE_READWRITE);
|
||||
@ -2946,7 +3030,7 @@ static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags,
|
||||
p_new = NULL;
|
||||
} else {
|
||||
if (!UseNUMAInterleaving) {
|
||||
p_new = (char *) VirtualAlloc(next_alloc_addr,
|
||||
p_new = (char *) virtualAlloc(next_alloc_addr,
|
||||
bytes_to_rq,
|
||||
flags,
|
||||
prot);
|
||||
@ -2954,7 +3038,7 @@ static char* allocate_pages_individually(size_t bytes, char* addr, DWORD flags,
|
||||
// get the next node to use from the used_node_list
|
||||
assert(numa_node_list_holder.get_count() > 0, "Multiple NUMA nodes expected");
|
||||
DWORD node = numa_node_list_holder.get_node_list_entry(count % numa_node_list_holder.get_count());
|
||||
p_new = (char *)VirtualAllocExNuma(hProc, next_alloc_addr, bytes_to_rq, flags, prot, node);
|
||||
p_new = (char *)virtualAllocExNuma(hProc, next_alloc_addr, bytes_to_rq, flags, prot, node);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3100,7 +3184,7 @@ char* os::map_memory_to_file(char* base, size_t size, int fd) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LPVOID addr = MapViewOfFileEx(fileMapping, FILE_MAP_WRITE, 0, 0, size, base);
|
||||
LPVOID addr = mapViewOfFileEx(fileMapping, FILE_MAP_WRITE, 0, 0, size, base);
|
||||
|
||||
CloseHandle(fileMapping);
|
||||
|
||||
@ -3127,14 +3211,19 @@ void os::split_reserved_memory(char *base, size_t size, size_t split) {
|
||||
assert(is_aligned(base, os::vm_allocation_granularity()), "Sanity");
|
||||
assert(is_aligned(split_address, os::vm_allocation_granularity()), "Sanity");
|
||||
|
||||
release_memory(base, size);
|
||||
attempt_reserve_memory_at(base, split);
|
||||
attempt_reserve_memory_at(split_address, size - split);
|
||||
const bool rc = release_memory(base, size) &&
|
||||
(attempt_reserve_memory_at(base, split) != NULL) &&
|
||||
(attempt_reserve_memory_at(split_address, size - split) != NULL);
|
||||
if (!rc) {
|
||||
log_warning(os)("os::split_reserved_memory failed for [" RANGE_FORMAT ")",
|
||||
RANGE_FORMAT_ARGS(base, size));
|
||||
assert(false, "os::split_reserved_memory failed for [" RANGE_FORMAT ")",
|
||||
RANGE_FORMAT_ARGS(base, size));
|
||||
}
|
||||
|
||||
// NMT: nothing to do here. Since Windows implements the split by
|
||||
// releasing and re-reserving memory, the parts are already registered
|
||||
// as individual mappings with NMT.
|
||||
|
||||
}
|
||||
|
||||
// Multiple threads can race in this code but it's not possible to unmap small sections of
|
||||
@ -3198,7 +3287,7 @@ char* os::pd_attempt_reserve_memory_at(char* addr, size_t bytes) {
|
||||
// will go thru reserve_memory_special rather than thru here.
|
||||
bool use_individual = (UseNUMAInterleaving && !UseLargePages);
|
||||
if (!use_individual) {
|
||||
res = (char*)VirtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE);
|
||||
res = (char*)virtualAlloc(addr, bytes, MEM_RESERVE, PAGE_READWRITE);
|
||||
} else {
|
||||
elapsedTimer reserveTimer;
|
||||
if (Verbose && PrintMiscellaneous) reserveTimer.start();
|
||||
@ -3277,7 +3366,7 @@ char* os::pd_reserve_memory_special(size_t bytes, size_t alignment, char* addr,
|
||||
|
||||
// normal policy just allocate it all at once
|
||||
DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
|
||||
char * res = (char *)VirtualAlloc(addr, bytes, flag, prot);
|
||||
char * res = (char *)virtualAlloc(addr, bytes, flag, prot);
|
||||
|
||||
return res;
|
||||
}
|
||||
@ -3314,7 +3403,7 @@ bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
|
||||
// is always within a reserve covered by a single VirtualAlloc
|
||||
// in that case we can just do a single commit for the requested size
|
||||
if (!UseNUMAInterleaving) {
|
||||
if (VirtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) {
|
||||
if (virtualAlloc(addr, bytes, MEM_COMMIT, PAGE_READWRITE) == NULL) {
|
||||
NOT_PRODUCT(warn_fail_commit_memory(addr, bytes, exec);)
|
||||
return false;
|
||||
}
|
||||
@ -3339,7 +3428,7 @@ bool os::pd_commit_memory(char* addr, size_t bytes, bool exec) {
|
||||
MEMORY_BASIC_INFORMATION alloc_info;
|
||||
VirtualQuery(next_alloc_addr, &alloc_info, sizeof(alloc_info));
|
||||
size_t bytes_to_rq = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize);
|
||||
if (VirtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT,
|
||||
if (virtualAlloc(next_alloc_addr, bytes_to_rq, MEM_COMMIT,
|
||||
PAGE_READWRITE) == NULL) {
|
||||
NOT_PRODUCT(warn_fail_commit_memory(next_alloc_addr, bytes_to_rq,
|
||||
exec);)
|
||||
@ -3391,11 +3480,11 @@ bool os::pd_uncommit_memory(char* addr, size_t bytes) {
|
||||
}
|
||||
assert((size_t) addr % os::vm_page_size() == 0, "uncommit on page boundaries");
|
||||
assert(bytes % os::vm_page_size() == 0, "uncommit in page-sized chunks");
|
||||
return (VirtualFree(addr, bytes, MEM_DECOMMIT) != 0);
|
||||
return (virtualFree(addr, bytes, MEM_DECOMMIT) == TRUE);
|
||||
}
|
||||
|
||||
bool os::pd_release_memory(char* addr, size_t bytes) {
|
||||
return VirtualFree(addr, 0, MEM_RELEASE) != 0;
|
||||
return virtualFree(addr, 0, MEM_RELEASE) != 0;
|
||||
}
|
||||
|
||||
bool os::pd_create_stack_guard_pages(char* addr, size_t size) {
|
||||
@ -4941,10 +5030,9 @@ char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
|
||||
// we might consider DLLizing the shared archive with a proper PE
|
||||
// header so that mapping executable + sharing is possible.
|
||||
|
||||
base = (char*) VirtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
|
||||
base = (char*) virtualAlloc(addr, bytes, MEM_COMMIT | MEM_RESERVE,
|
||||
PAGE_READWRITE);
|
||||
if (base == NULL) {
|
||||
log_info(os)("VirtualAlloc() failed: GetLastError->%ld.", GetLastError());
|
||||
CloseHandle(hFile);
|
||||
return NULL;
|
||||
}
|
||||
@ -4976,10 +5064,9 @@ char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset,
|
||||
}
|
||||
|
||||
DWORD access = read_only ? FILE_MAP_READ : FILE_MAP_COPY;
|
||||
base = (char*)MapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
|
||||
base = (char*)mapViewOfFileEx(hMap, access, 0, (DWORD)file_offset,
|
||||
(DWORD)bytes, addr);
|
||||
if (base == NULL) {
|
||||
log_info(os)("MapViewOfFileEx() failed: GetLastError->%ld.", GetLastError());
|
||||
CloseHandle(hMap);
|
||||
CloseHandle(hFile);
|
||||
return NULL;
|
||||
@ -5051,9 +5138,8 @@ bool os::pd_unmap_memory(char* addr, size_t bytes) {
|
||||
return pd_release_memory(addr, bytes);
|
||||
}
|
||||
|
||||
BOOL result = UnmapViewOfFile(addr);
|
||||
BOOL result = unmapViewOfFile(addr);
|
||||
if (result == 0) {
|
||||
log_info(os)("UnmapViewOfFile() failed: GetLastError->%ld.", GetLastError());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user