Wed, 21 Aug 2013 13:18:52 +0200
8022808: Kitchensink hangs on macos
Summary: Use pthread_mach_thread_np() instead of mach_thread_self() to avoid leaking resources
Reviewed-by: dholmes, rbackman
src/os/bsd/vm/os_bsd.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/os/bsd/vm/os_bsd.cpp Tue Aug 20 13:47:40 2013 -0700 1.2 +++ b/src/os/bsd/vm/os_bsd.cpp Wed Aug 21 13:18:52 2013 +0200 1.3 @@ -642,13 +642,14 @@ 1.4 #endif 1.5 1.6 #ifdef __APPLE__ 1.7 -static uint64_t locate_unique_thread_id() { 1.8 +static uint64_t locate_unique_thread_id(mach_port_t mach_thread_port) { 1.9 // Additional thread_id used to correlate threads in SA 1.10 thread_identifier_info_data_t m_ident_info; 1.11 mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; 1.12 1.13 - thread_info(::mach_thread_self(), THREAD_IDENTIFIER_INFO, 1.14 + thread_info(mach_thread_port, THREAD_IDENTIFIER_INFO, 1.15 (thread_info_t) &m_ident_info, &count); 1.16 + 1.17 return m_ident_info.thread_id; 1.18 } 1.19 #endif 1.20 @@ -679,9 +680,14 @@ 1.21 } 1.22 1.23 #ifdef __APPLE__ 1.24 - // thread_id is mach thread on macos 1.25 - osthread->set_thread_id(::mach_thread_self()); 1.26 - osthread->set_unique_thread_id(locate_unique_thread_id()); 1.27 + // thread_id is mach thread on macos, which pthreads graciously caches and provides for us 1.28 + mach_port_t thread_id = ::pthread_mach_thread_np(::pthread_self()); 1.29 + guarantee(thread_id != 0, "thread id missing from pthreads"); 1.30 + osthread->set_thread_id(thread_id); 1.31 + 1.32 + uint64_t unique_thread_id = locate_unique_thread_id(thread_id); 1.33 + guarantee(unique_thread_id != 0, "unique thread id was not found"); 1.34 + osthread->set_unique_thread_id(unique_thread_id); 1.35 #else 1.36 // thread_id is pthread_id on BSD 1.37 osthread->set_thread_id(::pthread_self()); 1.38 @@ -843,8 +849,14 @@ 1.39 1.40 // Store pthread info into the OSThread 1.41 #ifdef __APPLE__ 1.42 - osthread->set_thread_id(::mach_thread_self()); 1.43 - osthread->set_unique_thread_id(locate_unique_thread_id()); 1.44 + // thread_id is mach thread on macos, which pthreads graciously caches and provides for us 1.45 + mach_port_t thread_id = ::pthread_mach_thread_np(::pthread_self()); 1.46 + guarantee(thread_id != 0, "just checking"); 1.47 + osthread->set_thread_id(thread_id); 1.48 + 1.49 + uint64_t unique_thread_id = locate_unique_thread_id(thread_id); 1.50 + guarantee(unique_thread_id != 0, "just checking"); 1.51 + osthread->set_unique_thread_id(unique_thread_id); 1.52 #else 1.53 osthread->set_thread_id(::pthread_self()); 1.54 #endif 1.55 @@ -1115,7 +1127,7 @@ 1.56 1.57 intx os::current_thread_id() { 1.58 #ifdef __APPLE__ 1.59 - return (intx)::mach_thread_self(); 1.60 + return (intx)::pthread_mach_thread_np(::pthread_self()); 1.61 #else 1.62 return (intx)::pthread_self(); 1.63 #endif