< prev index next >

src/os/aix/vm/os_aix.cpp

Print this page




2269 int os::vm_allocation_granularity() {
2270   assert(os::Aix::page_size() != -1, "must call os::init");
2271   return os::Aix::page_size();
2272 }
2273 
2274 #ifdef PRODUCT
2275 static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
2276                                     int err) {
2277   warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
2278           ", %d) failed; error='%s' (errno=%d)", addr, size, exec,
2279           strerror(err), err);
2280 }
2281 #endif
2282 
2283 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
2284                                   const char* mesg) {
2285   assert(mesg != NULL, "mesg must be specified");
2286   if (!pd_commit_memory(addr, size, exec)) {
2287     // Add extra info in product mode for vm_exit_out_of_memory():
2288     PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
2289     vm_exit_out_of_memory(size, OOM_MMAP_ERROR, mesg);
2290   }
2291 }
2292 
2293 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
2294 
2295   assert0(is_aligned_to(addr, os::vm_page_size()));
2296   assert0(is_aligned_to(size, os::vm_page_size()));
2297 
2298   vmembk_t* const vmi = vmembk_find(addr);
2299   assert0(vmi);
2300   vmi->assert_is_valid_subrange(addr, size);
2301 
2302   trcVerbose("commit_memory [" PTR_FORMAT " - " PTR_FORMAT "].", addr, addr + size - 1);
2303 
2304   return true;
2305 }
2306 
2307 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, bool exec) {
2308   return pd_commit_memory(addr, size, exec);
2309 }


3103   // Check for overwrite.
3104   struct sigaction oldAct;
3105   sigaction(sig, (struct sigaction*)NULL, &oldAct);
3106 
3107   void* oldhand = oldAct.sa_sigaction
3108     ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
3109     : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
3110   // Renamed 'signalHandler' to avoid collision with other shared libs.
3111   if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
3112       oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
3113       oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)javaSignalHandler)) {
3114     if (AllowUserSignalHandlers || !set_installed) {
3115       // Do not overwrite; user takes responsibility to forward to us.
3116       return;
3117     } else if (UseSignalChaining) {
3118       // save the old handler in jvm
3119       save_preinstalled_handler(sig, oldAct);
3120       // libjsig also interposes the sigaction() call below and saves the
3121       // old sigaction on it own.
3122     } else {
3123       fatal(err_msg("Encountered unexpected pre-existing sigaction handler "
3124                     "%#lx for signal %d.", (long)oldhand, sig));
3125     }
3126   }
3127 
3128   struct sigaction sigAct;
3129   sigfillset(&(sigAct.sa_mask));
3130   if (!set_installed) {
3131     sigAct.sa_handler = SIG_DFL;
3132     sigAct.sa_flags = SA_RESTART;
3133   } else {
3134     // Renamed 'signalHandler' to avoid collision with other shared libs.
3135     sigAct.sa_sigaction = javaSignalHandler;
3136     sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
3137   }
3138   // Save flags, which are set by ours
3139   assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
3140   sigflags[sig] = sigAct.sa_flags;
3141 
3142   int ret = sigaction(sig, &sigAct, &oldAct);
3143   assert(ret == 0, "check");
3144 


3682     // VM_Exit VMOperation's doit method.
3683     if (atexit(perfMemory_exit_helper) != 0) {
3684       warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3685     }
3686   }
3687 
3688   return JNI_OK;
3689 }
3690 
3691 // Mark the polling page as unreadable
3692 void os::make_polling_page_unreadable(void) {
3693   if (!guard_memory((char*)_polling_page, Aix::page_size())) {
3694     fatal("Could not disable polling page");
3695   }
3696 };
3697 
3698 // Mark the polling page as readable
3699 void os::make_polling_page_readable(void) {
3700   // Changed according to os_linux.cpp.
3701   if (!checked_mprotect((char *)_polling_page, Aix::page_size(), PROT_READ)) {
3702     fatal(err_msg("Could not enable polling page at " PTR_FORMAT, _polling_page));
3703   }
3704 };
3705 
3706 int os::active_processor_count() {
3707   int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
3708   assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
3709   return online_cpus;
3710 }
3711 
3712 void os::set_native_thread_name(const char *name) {
3713   // Not yet implemented.
3714   return;
3715 }
3716 
3717 bool os::distribute_processes(uint length, uint* distribution) {
3718   // Not yet implemented.
3719   return false;
3720 }
3721 
3722 bool os::bind_to_processor(uint processor_id) {




2269 int os::vm_allocation_granularity() {
2270   assert(os::Aix::page_size() != -1, "must call os::init");
2271   return os::Aix::page_size();
2272 }
2273 
2274 #ifdef PRODUCT
2275 static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
2276                                     int err) {
2277   warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT
2278           ", %d) failed; error='%s' (errno=%d)", addr, size, exec,
2279           strerror(err), err);
2280 }
2281 #endif
2282 
2283 void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec,
2284                                   const char* mesg) {
2285   assert(mesg != NULL, "mesg must be specified");
2286   if (!pd_commit_memory(addr, size, exec)) {
2287     // Add extra info in product mode for vm_exit_out_of_memory():
2288     PRODUCT_ONLY(warn_fail_commit_memory(addr, size, exec, errno);)
2289     vm_exit_out_of_memory(size, OOM_MMAP_ERROR, "%s", mesg);
2290   }
2291 }
2292 
2293 bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
2294 
2295   assert0(is_aligned_to(addr, os::vm_page_size()));
2296   assert0(is_aligned_to(size, os::vm_page_size()));
2297 
2298   vmembk_t* const vmi = vmembk_find(addr);
2299   assert0(vmi);
2300   vmi->assert_is_valid_subrange(addr, size);
2301 
2302   trcVerbose("commit_memory [" PTR_FORMAT " - " PTR_FORMAT "].", addr, addr + size - 1);
2303 
2304   return true;
2305 }
2306 
2307 bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, bool exec) {
2308   return pd_commit_memory(addr, size, exec);
2309 }


3103   // Check for overwrite.
3104   struct sigaction oldAct;
3105   sigaction(sig, (struct sigaction*)NULL, &oldAct);
3106 
3107   void* oldhand = oldAct.sa_sigaction
3108     ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction)
3109     : CAST_FROM_FN_PTR(void*, oldAct.sa_handler);
3110   // Renamed 'signalHandler' to avoid collision with other shared libs.
3111   if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) &&
3112       oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) &&
3113       oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)javaSignalHandler)) {
3114     if (AllowUserSignalHandlers || !set_installed) {
3115       // Do not overwrite; user takes responsibility to forward to us.
3116       return;
3117     } else if (UseSignalChaining) {
3118       // save the old handler in jvm
3119       save_preinstalled_handler(sig, oldAct);
3120       // libjsig also interposes the sigaction() call below and saves the
3121       // old sigaction on it own.
3122     } else {
3123       fatal("Encountered unexpected pre-existing sigaction handler "
3124             "%#lx for signal %d.", (long)oldhand, sig);
3125     }
3126   }
3127 
3128   struct sigaction sigAct;
3129   sigfillset(&(sigAct.sa_mask));
3130   if (!set_installed) {
3131     sigAct.sa_handler = SIG_DFL;
3132     sigAct.sa_flags = SA_RESTART;
3133   } else {
3134     // Renamed 'signalHandler' to avoid collision with other shared libs.
3135     sigAct.sa_sigaction = javaSignalHandler;
3136     sigAct.sa_flags = SA_SIGINFO|SA_RESTART;
3137   }
3138   // Save flags, which are set by ours
3139   assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range");
3140   sigflags[sig] = sigAct.sa_flags;
3141 
3142   int ret = sigaction(sig, &sigAct, &oldAct);
3143   assert(ret == 0, "check");
3144 


3682     // VM_Exit VMOperation's doit method.
3683     if (atexit(perfMemory_exit_helper) != 0) {
3684       warning("os::init_2 atexit(perfMemory_exit_helper) failed");
3685     }
3686   }
3687 
3688   return JNI_OK;
3689 }
3690 
3691 // Mark the polling page as unreadable
3692 void os::make_polling_page_unreadable(void) {
3693   if (!guard_memory((char*)_polling_page, Aix::page_size())) {
3694     fatal("Could not disable polling page");
3695   }
3696 };
3697 
3698 // Mark the polling page as readable
3699 void os::make_polling_page_readable(void) {
3700   // Changed according to os_linux.cpp.
3701   if (!checked_mprotect((char *)_polling_page, Aix::page_size(), PROT_READ)) {
3702     fatal("Could not enable polling page at " PTR_FORMAT, _polling_page);
3703   }
3704 };
3705 
3706 int os::active_processor_count() {
3707   int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
3708   assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
3709   return online_cpus;
3710 }
3711 
3712 void os::set_native_thread_name(const char *name) {
3713   // Not yet implemented.
3714   return;
3715 }
3716 
3717 bool os::distribute_processes(uint length, uint* distribution) {
3718   // Not yet implemented.
3719   return false;
3720 }
3721 
3722 bool os::bind_to_processor(uint processor_id) {


< prev index next >