src/share/vm/runtime/os.cpp

Print this page




1387   os::protect_memory((char *)os::get_memory_serialize_page(),
1388                      os::vm_page_size(), MEM_PROT_READ);
1389   os::protect_memory((char *)os::get_memory_serialize_page(),
1390                      os::vm_page_size(), MEM_PROT_RW);
1391   Thread::muxRelease(&SerializePageLock);
1392 }
1393 
1394 // Returns true if the current stack pointer is above the stack shadow
1395 // pages, false otherwise.
1396 
1397 bool os::stack_shadow_pages_available(Thread *thread, methodHandle method) {
1398   assert(StackRedPages > 0 && StackYellowPages > 0,"Sanity check");
1399   address sp = current_stack_pointer();
1400   // Check if we have StackShadowPages above the yellow zone.  This parameter
1401   // is dependent on the depth of the maximum VM call stack possible from
1402   // the handler for stack overflow.  'instanceof' in the stack overflow
1403   // handler or a println uses at least 8k stack of VM and native code
1404   // respectively.
1405   const int framesize_in_bytes =
1406     Interpreter::size_top_interpreter_activation(method()) * wordSize;
1407   int reserved_area = ((StackShadowPages + StackRedPages + StackYellowPages)
1408                       * vm_page_size()) + framesize_in_bytes;

1409   // The very lower end of the stack
1410   address stack_limit = thread->stack_base() - thread->stack_size();
1411   return (sp > (stack_limit + reserved_area));
1412 }
1413 
1414 size_t os::page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned) {
1415   assert(min_pages > 0, "sanity");
1416   if (UseLargePages) {
1417     const size_t max_page_size = region_size / min_pages;
1418 
1419     for (size_t i = 0; _page_sizes[i] != 0; ++i) {
1420       const size_t page_size = _page_sizes[i];
1421       if (page_size <= max_page_size) {
1422         if (!must_be_aligned || is_size_aligned(region_size, page_size)) {
1423           return page_size;
1424         }
1425       }
1426     }
1427   }
1428 




1387   os::protect_memory((char *)os::get_memory_serialize_page(),
1388                      os::vm_page_size(), MEM_PROT_READ);
1389   os::protect_memory((char *)os::get_memory_serialize_page(),
1390                      os::vm_page_size(), MEM_PROT_RW);
1391   Thread::muxRelease(&SerializePageLock);
1392 }
1393 
1394 // Returns true if the current stack pointer is above the stack shadow
1395 // pages, false otherwise.
1396 
1397 bool os::stack_shadow_pages_available(Thread *thread, methodHandle method) {
1398   assert(StackRedPages > 0 && StackYellowPages > 0,"Sanity check");
1399   address sp = current_stack_pointer();
1400   // Check if we have StackShadowPages above the yellow zone.  This parameter
1401   // is dependent on the depth of the maximum VM call stack possible from
1402   // the handler for stack overflow.  'instanceof' in the stack overflow
1403   // handler or a println uses at least 8k stack of VM and native code
1404   // respectively.
1405   const int framesize_in_bytes =
1406     Interpreter::size_top_interpreter_activation(method()) * wordSize;
1407   int reserved_area = ((StackShadowPages + StackRedPages + StackYellowPages
1408                       + StackReservedPages) * vm_page_size())
1409                       + framesize_in_bytes;
1410   // The very lower end of the stack
1411   address stack_limit = thread->stack_base() - thread->stack_size();
1412   return (sp > (stack_limit + reserved_area));
1413 }
1414 
1415 size_t os::page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned) {
1416   assert(min_pages > 0, "sanity");
1417   if (UseLargePages) {
1418     const size_t max_page_size = region_size / min_pages;
1419 
1420     for (size_t i = 0; _page_sizes[i] != 0; ++i) {
1421       const size_t page_size = _page_sizes[i];
1422       if (page_size <= max_page_size) {
1423         if (!must_be_aligned || is_size_aligned(region_size, page_size)) {
1424           return page_size;
1425         }
1426       }
1427     }
1428   }
1429