mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 11:04:34 +02:00
8256287: [windows] add loop fuse to map_or_reserve_memory_aligned
Reviewed-by: luhenry, iklam, minqi
This commit is contained in:
parent
6e35bcbf03
commit
0357db3581
1 changed files with 15 additions and 12 deletions
|
@ -3238,28 +3238,31 @@ static char* map_or_reserve_memory_aligned(size_t size, size_t alignment, int fi
|
||||||
assert(extra_size >= size, "overflow, size is too large to allow alignment");
|
assert(extra_size >= size, "overflow, size is too large to allow alignment");
|
||||||
|
|
||||||
char* aligned_base = NULL;
|
char* aligned_base = NULL;
|
||||||
|
static const int max_attempts = 20;
|
||||||
|
|
||||||
do {
|
for (int attempt = 0; attempt < max_attempts && aligned_base == NULL; attempt ++) {
|
||||||
char* extra_base = file_desc != -1 ?
|
char* extra_base = file_desc != -1 ? os::map_memory_to_file(extra_size, file_desc) :
|
||||||
os::map_memory_to_file(extra_size, file_desc) :
|
os::reserve_memory(extra_size);
|
||||||
os::reserve_memory(extra_size);
|
|
||||||
if (extra_base == NULL) {
|
if (extra_base == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
// Do manual alignment
|
// Do manual alignment
|
||||||
aligned_base = align_up(extra_base, alignment);
|
aligned_base = align_up(extra_base, alignment);
|
||||||
|
|
||||||
if (file_desc != -1) {
|
bool rc = (file_desc != -1) ? os::unmap_memory(extra_base, extra_size) :
|
||||||
os::unmap_memory(extra_base, extra_size);
|
os::release_memory(extra_base, extra_size);
|
||||||
} else {
|
assert(rc, "release failed");
|
||||||
os::release_memory(extra_base, extra_size);
|
if (!rc) {
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
aligned_base = file_desc != -1 ?
|
// Attempt to map, into the just vacated space, the slightly smaller aligned area.
|
||||||
os::attempt_map_memory_to_file_at(aligned_base, size, file_desc) :
|
// Which may fail, hence the loop.
|
||||||
os::attempt_reserve_memory_at(aligned_base, size);
|
aligned_base = file_desc != -1 ? os::attempt_map_memory_to_file_at(aligned_base, size, file_desc) :
|
||||||
|
os::attempt_reserve_memory_at(aligned_base, size);
|
||||||
|
}
|
||||||
|
|
||||||
} while (aligned_base == NULL);
|
assert(aligned_base != NULL, "Did not manage to re-map after %d attempts?", max_attempts);
|
||||||
|
|
||||||
return aligned_base;
|
return aligned_base;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue