1153 // 4466587: glibc 2.2.x compiled w/o "--enable-kernel=2.4.0" (RH 7.0, |
1153 // 4466587: glibc 2.2.x compiled w/o "--enable-kernel=2.4.0" (RH 7.0, |
1154 // SuSE 7.2, Debian) can not handle alternate signal stack correctly |
1154 // SuSE 7.2, Debian) can not handle alternate signal stack correctly |
1155 // for initial thread if its stack size exceeds 6M. Cap it at 2M, |
1155 // for initial thread if its stack size exceeds 6M. Cap it at 2M, |
1156 // in case other parts in glibc still assumes 2M max stack size. |
1156 // in case other parts in glibc still assumes 2M max stack size. |
1157 // FIXME: alt signal stack is gone, maybe we can relax this constraint? |
1157 // FIXME: alt signal stack is gone, maybe we can relax this constraint? |
1158 #ifndef IA64 |
|
1159 if (stack_size > 2 * K * K) stack_size = 2 * K * K; |
|
1160 #else |
|
1161 // Problem still exists RH7.2 (IA64 anyway) but 2MB is a little small |
1158 // Problem still exists RH7.2 (IA64 anyway) but 2MB is a little small |
1162 if (stack_size > 4 * K * K) stack_size = 4 * K * K; |
1159 if (stack_size > 2 * K * K IA64_ONLY(*2)) |
1163 #endif |
1160 stack_size = 2 * K * K IA64_ONLY(*2); |
1164 |
|
1165 // Try to figure out where the stack base (top) is. This is harder. |
1161 // Try to figure out where the stack base (top) is. This is harder. |
1166 // |
1162 // |
1167 // When an application is started, glibc saves the initial stack pointer in |
1163 // When an application is started, glibc saves the initial stack pointer in |
1168 // a global variable "__libc_stack_end", which is then used by system |
1164 // a global variable "__libc_stack_end", which is then used by system |
1169 // libraries. __libc_stack_end should be pretty close to stack top. The |
1165 // libraries. __libc_stack_end should be pretty close to stack top. The |
4365 int os::Linux::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime) |
4361 int os::Linux::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime) |
4366 { |
4362 { |
4367 if (is_NPTL()) { |
4363 if (is_NPTL()) { |
4368 return pthread_cond_timedwait(_cond, _mutex, _abstime); |
4364 return pthread_cond_timedwait(_cond, _mutex, _abstime); |
4369 } else { |
4365 } else { |
4370 #ifndef IA64 |
|
4371 // 6292965: LinuxThreads pthread_cond_timedwait() resets FPU control |
4366 // 6292965: LinuxThreads pthread_cond_timedwait() resets FPU control |
4372 // word back to default 64bit precision if condvar is signaled. Java |
4367 // word back to default 64bit precision if condvar is signaled. Java |
4373 // wants 53bit precision. Save and restore current value. |
4368 // wants 53bit precision. Save and restore current value. |
4374 int fpu = get_fpu_control_word(); |
4369 int fpu = get_fpu_control_word(); |
4375 #endif // IA64 |
|
4376 int status = pthread_cond_timedwait(_cond, _mutex, _abstime); |
4370 int status = pthread_cond_timedwait(_cond, _mutex, _abstime); |
4377 #ifndef IA64 |
|
4378 set_fpu_control_word(fpu); |
4371 set_fpu_control_word(fpu); |
4379 #endif // IA64 |
|
4380 return status; |
4372 return status; |
4381 } |
4373 } |
4382 } |
4374 } |
4383 |
4375 |
4384 //////////////////////////////////////////////////////////////////////////////// |
4376 //////////////////////////////////////////////////////////////////////////////// |