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) {
|