@@ -3238,28 +3238,31 @@ static char* map_or_reserve_memory_aligned(size_t size, size_t alignment, int fi
3238
3238
assert (extra_size >= size, " overflow, size is too large to allow alignment" );
3239
3239
3240
3240
char * aligned_base = NULL ;
3241
+ static const int max_attempts = 20 ;
3241
3242
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);
3246
3246
if (extra_base == NULL ) {
3247
3247
return NULL ;
3248
3248
}
3249
3249
// Do manual alignment
3250
3250
aligned_base = align_up (extra_base, alignment);
3251
3251
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 ;
3256
3257
}
3257
3258
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
+ }
3261
3264
3262
- } while (aligned_base == NULL );
3265
+ assert (aligned_base != NULL , " Did not manage to re-map after %d attempts? " , max_attempts );
3263
3266
3264
3267
return aligned_base;
3265
3268
}
0 commit comments