< prev index next >

src/hotspot/os/linux/os_linux.cpp

Print this page

        

*** 3104,3114 **** } bool os::committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size) { int mincore_return_value; const size_t stripe = 1024; // query this many pages each time ! unsigned char vec[stripe]; const size_t page_sz = os::vm_page_size(); size_t pages = size / page_sz; assert(is_aligned(start, page_sz), "Start address must be page aligned"); assert(is_aligned(size, page_sz), "Size must be page aligned"); --- 3104,3117 ---- } bool os::committed_in_range(address start, size_t size, address& committed_start, size_t& committed_size) { int mincore_return_value; const size_t stripe = 1024; // query this many pages each time ! unsigned char vec[stripe + 1]; ! // set a guard ! vec[stripe] = 'X'; ! const size_t page_sz = os::vm_page_size(); size_t pages = size / page_sz; assert(is_aligned(start, page_sz), "Start address must be page aligned"); assert(is_aligned(size, page_sz), "Size must be page aligned");
*** 3116,3126 **** committed_start = NULL; int loops = (pages + stripe - 1) / stripe; int committed_pages = 0; address loop_base = start; ! for (int index = 0; index < loops; index ++) { assert(pages > 0, "Nothing to do"); int pages_to_query = (pages >= stripe) ? stripe : pages; pages -= pages_to_query; // Get stable read --- 3119,3131 ---- committed_start = NULL; int loops = (pages + stripe - 1) / stripe; int committed_pages = 0; address loop_base = start; ! bool found_range = false; ! ! for (int index = 0; index < loops && !found_range; index ++) { assert(pages > 0, "Nothing to do"); int pages_to_query = (pages >= stripe) ? stripe : pages; pages -= pages_to_query; // Get stable read
*** 3131,3146 **** --- 3136,3153 ---- // Bailout and return as not committed for now. if (mincore_return_value == -1 && errno == ENOMEM) { return false; } + assert(vec[stripe] == 'X', "overflow guard"); assert(mincore_return_value == 0, "Range must be valid"); // Process this stripe for (int vecIdx = 0; vecIdx < pages_to_query; vecIdx ++) { if ((vec[vecIdx] & 0x01) == 0) { // not committed // End of current contiguous region if (committed_start != NULL) { + found_range = true; break; } } else { // committed // Start of region if (committed_start == NULL) {
< prev index next >