hotspot/src/os/linux/vm/os_linux.cpp
changeset 15475 73896d91270c
parent 15234 ff1f01be5fbd
child 15743 f708934a12e7
equal deleted inserted replaced
15474:62425bb6b9e3 15475:73896d91270c
  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 ////////////////////////////////////////////////////////////////////////////////