8022808: Kitchensink hangs on macos

Wed, 21 Aug 2013 13:18:52 +0200

author
sla
date
Wed, 21 Aug 2013 13:18:52 +0200
changeset 5563
c6ec0a97b30a
parent 5537
9d6c9b0a8f15
child 5564
3a57fa7a4cd0
child 5565
e37ab280bbce
child 5567
c062a6e1fa33
child 5571
a70566600baf

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

mercurial