Skip to content

Commit 0357db3

Browse files
committed
8256287: [windows] add loop fuse to map_or_reserve_memory_aligned
Reviewed-by: luhenry, iklam, minqi
1 parent 6e35bcb commit 0357db3

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

src/hotspot/os/windows/os_windows.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3238,28 +3238,31 @@ static char* map_or_reserve_memory_aligned(size_t size, size_t alignment, int fi
32383238
assert(extra_size >= size, "overflow, size is too large to allow alignment");
32393239

32403240
char* aligned_base = NULL;
3241+
static const int max_attempts = 20;
32413242

3242-
do {
3243-
char* extra_base = file_desc != -1 ?
3244-
os::map_memory_to_file(extra_size, file_desc) :
3245-
os::reserve_memory(extra_size);
3243+
for (int attempt = 0; attempt < max_attempts && aligned_base == NULL; attempt ++) {
3244+
char* extra_base = file_desc != -1 ? os::map_memory_to_file(extra_size, file_desc) :
3245+
os::reserve_memory(extra_size);
32463246
if (extra_base == NULL) {
32473247
return NULL;
32483248
}
32493249
// Do manual alignment
32503250
aligned_base = align_up(extra_base, alignment);
32513251

3252-
if (file_desc != -1) {
3253-
os::unmap_memory(extra_base, extra_size);
3254-
} else {
3255-
os::release_memory(extra_base, extra_size);
3252+
bool rc = (file_desc != -1) ? os::unmap_memory(extra_base, extra_size) :
3253+
os::release_memory(extra_base, extra_size);
3254+
assert(rc, "release failed");
3255+
if (!rc) {
3256+
return NULL;
32563257
}
32573258

3258-
aligned_base = file_desc != -1 ?
3259-
os::attempt_map_memory_to_file_at(aligned_base, size, file_desc) :
3260-
os::attempt_reserve_memory_at(aligned_base, size);
3259+
// Attempt to map, into the just vacated space, the slightly smaller aligned area.
3260+
// Which may fail, hence the loop.
3261+
aligned_base = file_desc != -1 ? os::attempt_map_memory_to_file_at(aligned_base, size, file_desc) :
3262+
os::attempt_reserve_memory_at(aligned_base, size);
3263+
}
32613264

3262-
} while (aligned_base == NULL);
3265+
assert(aligned_base != NULL, "Did not manage to re-map after %d attempts?", max_attempts);
32633266

32643267
return aligned_base;
32653268
}

0 commit comments

Comments
 (0)