Mercurial > hg > truffle
comparison src/os/aix/vm/os_aix.cpp @ 14451:b858620b0081
8031319: PPC64: Some fixes in ppc and aix coding.
Reviewed-by: kvn
author | goetz |
---|---|
date | Tue, 07 Jan 2014 17:24:59 +0100 |
parents | 3068270ba476 |
children | a13badbb8b8e 9200402b42d5 |
comparison
equal
deleted
inserted
replaced
14450:c3efa8868779 | 14451:b858620b0081 |
---|---|
1150 // Return the real, user, and system times in seconds from an | 1150 // Return the real, user, and system times in seconds from an |
1151 // arbitrary fixed point in the past. | 1151 // arbitrary fixed point in the past. |
1152 bool os::getTimesSecs(double* process_real_time, | 1152 bool os::getTimesSecs(double* process_real_time, |
1153 double* process_user_time, | 1153 double* process_user_time, |
1154 double* process_system_time) { | 1154 double* process_system_time) { |
1155 Unimplemented(); | 1155 struct tms ticks; |
1156 return false; | 1156 clock_t real_ticks = times(&ticks); |
1157 | |
1158 if (real_ticks == (clock_t) (-1)) { | |
1159 return false; | |
1160 } else { | |
1161 double ticks_per_second = (double) clock_tics_per_sec; | |
1162 *process_user_time = ((double) ticks.tms_utime) / ticks_per_second; | |
1163 *process_system_time = ((double) ticks.tms_stime) / ticks_per_second; | |
1164 *process_real_time = ((double) real_ticks) / ticks_per_second; | |
1165 | |
1166 return true; | |
1167 } | |
1157 } | 1168 } |
1158 | 1169 |
1159 | 1170 |
1160 char * os::local_time_string(char *buf, size_t buflen) { | 1171 char * os::local_time_string(char *buf, size_t buflen) { |
1161 struct tm t; | 1172 struct tm t; |
2438 } | 2449 } |
2439 | 2450 |
2440 // trace | 2451 // trace |
2441 if (Verbose && !addr) { | 2452 if (Verbose && !addr) { |
2442 if (requested_addr != NULL) { | 2453 if (requested_addr != NULL) { |
2443 warning("failed to shm-allocate 0x%llX bytes at with address 0x%p.", size, requested_addr); | 2454 warning("failed to shm-allocate 0x%llX bytes at wish address 0x%p.", size, requested_addr); |
2444 } else { | 2455 } else { |
2445 warning("failed to shm-allocate 0x%llX bytes at any address.", size); | 2456 warning("failed to shm-allocate 0x%llX bytes at any address.", size); |
2446 } | 2457 } |
2447 } | 2458 } |
2448 | 2459 |
2519 shmbk_register(p_block); | 2530 shmbk_register(p_block); |
2520 UNLOCK_SHMBK | 2531 UNLOCK_SHMBK |
2521 | 2532 |
2522 cleanup_mmap: | 2533 cleanup_mmap: |
2523 | 2534 |
2524 if (addr) { | 2535 // trace |
2525 if (Verbose) { | 2536 if (Verbose) { |
2537 if (addr) { | |
2526 fprintf(stderr, "mmap-allocated 0x%p .. 0x%p (0x%llX bytes)\n", addr, addr + bytes, bytes); | 2538 fprintf(stderr, "mmap-allocated 0x%p .. 0x%p (0x%llX bytes)\n", addr, addr + bytes, bytes); |
2527 } | 2539 } |
2528 } | 2540 else { |
2529 else { | 2541 if (requested_addr != NULL) { |
2530 if (requested_addr != NULL) { | 2542 warning("failed to mmap-allocate 0x%llX bytes at wish address 0x%p.", bytes, requested_addr); |
2531 warning("failed to mmap-allocate 0x%llX bytes at wish address 0x%p.", bytes, requested_addr); | 2543 } else { |
2532 } else { | 2544 warning("failed to mmap-allocate 0x%llX bytes at any address.", bytes); |
2533 warning("failed to mmap-allocate 0x%llX bytes at any address.", bytes); | 2545 } |
2534 } | 2546 } |
2535 } | 2547 } |
2536 | 2548 |
2537 return addr; | 2549 return addr; |
2538 | 2550 |
3357 return actp; | 3369 return actp; |
3358 } | 3370 } |
3359 | 3371 |
3360 static bool call_chained_handler(struct sigaction *actp, int sig, | 3372 static bool call_chained_handler(struct sigaction *actp, int sig, |
3361 siginfo_t *siginfo, void *context) { | 3373 siginfo_t *siginfo, void *context) { |
3362 Unimplemented(); | 3374 // Call the old signal handler |
3375 if (actp->sa_handler == SIG_DFL) { | |
3376 // It's more reasonable to let jvm treat it as an unexpected exception | |
3377 // instead of taking the default action. | |
3378 return false; | |
3379 } else if (actp->sa_handler != SIG_IGN) { | |
3380 if ((actp->sa_flags & SA_NODEFER) == 0) { | |
3381 // automaticlly block the signal | |
3382 sigaddset(&(actp->sa_mask), sig); | |
3383 } | |
3384 | |
3385 sa_handler_t hand = NULL; | |
3386 sa_sigaction_t sa = NULL; | |
3387 bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0; | |
3388 // retrieve the chained handler | |
3389 if (siginfo_flag_set) { | |
3390 sa = actp->sa_sigaction; | |
3391 } else { | |
3392 hand = actp->sa_handler; | |
3393 } | |
3394 | |
3395 if ((actp->sa_flags & SA_RESETHAND) != 0) { | |
3396 actp->sa_handler = SIG_DFL; | |
3397 } | |
3398 | |
3399 // try to honor the signal mask | |
3400 sigset_t oset; | |
3401 pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset); | |
3402 | |
3403 // call into the chained handler | |
3404 if (siginfo_flag_set) { | |
3405 (*sa)(sig, siginfo, context); | |
3406 } else { | |
3407 (*hand)(sig); | |
3408 } | |
3409 | |
3410 // restore the signal mask | |
3411 pthread_sigmask(SIG_SETMASK, &oset, 0); | |
3412 } | |
3413 // Tell jvm's signal handler the signal is taken care of. | |
3363 return true; | 3414 return true; |
3364 } | 3415 } |
3365 | 3416 |
3366 bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) { | 3417 bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) { |
3367 bool chained = false; | 3418 bool chained = false; |
4039 else | 4090 else |
4040 return (address)(intptr_t(y) & page_bits); | 4091 return (address)(intptr_t(y) & page_bits); |
4041 } | 4092 } |
4042 | 4093 |
4043 bool os::find(address addr, outputStream* st) { | 4094 bool os::find(address addr, outputStream* st) { |
4044 Unimplemented(); | 4095 |
4096 st->print(PTR_FORMAT ": ", addr); | |
4097 | |
4098 const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr); | |
4099 if (lib) { | |
4100 lib->print(st); | |
4101 return true; | |
4102 } else { | |
4103 lib = LoadedLibraries::find_for_data_address(addr); | |
4104 if (lib) { | |
4105 lib->print(st); | |
4106 return true; | |
4107 } else { | |
4108 st->print_cr("(outside any module)"); | |
4109 } | |
4110 } | |
4111 | |
4045 return false; | 4112 return false; |
4046 } | 4113 } |
4047 | 4114 |
4048 //////////////////////////////////////////////////////////////////////////////// | 4115 //////////////////////////////////////////////////////////////////////////////// |
4049 // misc | 4116 // misc |
4097 // return ::vsnprintf(buf, count, format, args); | 4164 // return ::vsnprintf(buf, count, format, args); |
4098 // } | 4165 // } |
4099 | 4166 |
4100 // Is a (classpath) directory empty? | 4167 // Is a (classpath) directory empty? |
4101 bool os::dir_is_empty(const char* path) { | 4168 bool os::dir_is_empty(const char* path) { |
4102 Unimplemented(); | 4169 DIR *dir = NULL; |
4103 return false; | 4170 struct dirent *ptr; |
4171 | |
4172 dir = opendir(path); | |
4173 if (dir == NULL) return true; | |
4174 | |
4175 /* Scan the directory */ | |
4176 bool result = true; | |
4177 char buf[sizeof(struct dirent) + MAX_PATH]; | |
4178 while (result && (ptr = ::readdir(dir)) != NULL) { | |
4179 if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) { | |
4180 result = false; | |
4181 } | |
4182 } | |
4183 closedir(dir); | |
4184 return result; | |
4104 } | 4185 } |
4105 | 4186 |
4106 // This code originates from JDK's sysOpen and open64_w | 4187 // This code originates from JDK's sysOpen and open64_w |
4107 // from src/solaris/hpi/src/system_md.c | 4188 // from src/solaris/hpi/src/system_md.c |
4108 | 4189 |
4125 oflag = oflag & ~O_DELETE; | 4206 oflag = oflag & ~O_DELETE; |
4126 | 4207 |
4127 fd = ::open64(path, oflag, mode); | 4208 fd = ::open64(path, oflag, mode); |
4128 if (fd == -1) return -1; | 4209 if (fd == -1) return -1; |
4129 | 4210 |
4130 //If the open succeeded, the file might still be a directory | 4211 // If the open succeeded, the file might still be a directory. |
4131 { | 4212 { |
4132 struct stat64 buf64; | 4213 struct stat64 buf64; |
4133 int ret = ::fstat64(fd, &buf64); | 4214 int ret = ::fstat64(fd, &buf64); |
4134 int st_mode = buf64.st_mode; | 4215 int st_mode = buf64.st_mode; |
4135 | 4216 |
4180 } | 4261 } |
4181 | 4262 |
4182 | 4263 |
4183 // create binary file, rewriting existing file if required | 4264 // create binary file, rewriting existing file if required |
4184 int os::create_binary_file(const char* path, bool rewrite_existing) { | 4265 int os::create_binary_file(const char* path, bool rewrite_existing) { |
4185 Unimplemented(); | 4266 int oflags = O_WRONLY | O_CREAT; |
4186 return 0; | 4267 if (!rewrite_existing) { |
4268 oflags |= O_EXCL; | |
4269 } | |
4270 return ::open64(path, oflags, S_IREAD | S_IWRITE); | |
4187 } | 4271 } |
4188 | 4272 |
4189 // return current position of file pointer | 4273 // return current position of file pointer |
4190 jlong os::current_file_offset(int fd) { | 4274 jlong os::current_file_offset(int fd) { |
4191 return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR); | 4275 return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR); |