src/os/bsd/vm/threadCritical_bsd.cpp

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

author
sla
date
Wed, 21 Aug 2013 13:18:52 +0200
changeset 5563
c6ec0a97b30a
parent 4299
f34d701e952e
child 6876
710a3c8b516e
permissions
-rw-r--r--

8022808: Kitchensink hangs on macos
Summary: Use pthread_mach_thread_np() instead of mach_thread_self() to avoid leaking resources
Reviewed-by: dholmes, rbackman

never@3156 1 /*
never@3156 2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
never@3156 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
never@3156 4 *
never@3156 5 * This code is free software; you can redistribute it and/or modify it
never@3156 6 * under the terms of the GNU General Public License version 2 only, as
never@3156 7 * published by the Free Software Foundation.
never@3156 8 *
never@3156 9 * This code is distributed in the hope that it will be useful, but WITHOUT
never@3156 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
never@3156 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
never@3156 12 * version 2 for more details (a copy is included in the LICENSE file that
never@3156 13 * accompanied this code).
never@3156 14 *
never@3156 15 * You should have received a copy of the GNU General Public License version
never@3156 16 * 2 along with this work; if not, write to the Free Software Foundation,
never@3156 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
never@3156 18 *
never@3156 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
never@3156 20 * or visit www.oracle.com if you need additional information or have any
never@3156 21 * questions.
never@3156 22 *
never@3156 23 */
never@3156 24
never@3156 25 #include "precompiled.hpp"
stefank@4299 26 #include "runtime/thread.inline.hpp"
never@3156 27 #include "runtime/threadCritical.hpp"
never@3156 28
never@3156 29 // put OS-includes here
never@3156 30 # include <pthread.h>
never@3156 31
never@3156 32 //
never@3156 33 // See threadCritical.hpp for details of this class.
never@3156 34 //
never@3156 35
never@3156 36 static pthread_t tc_owner = 0;
never@3156 37 static pthread_mutex_t tc_mutex = PTHREAD_MUTEX_INITIALIZER;
never@3156 38 static int tc_count = 0;
never@3156 39
never@3156 40 void ThreadCritical::initialize() {
never@3156 41 }
never@3156 42
never@3156 43 void ThreadCritical::release() {
never@3156 44 }
never@3156 45
never@3156 46 ThreadCritical::ThreadCritical() {
never@3156 47 pthread_t self = pthread_self();
never@3156 48 if (self != tc_owner) {
never@3156 49 int ret = pthread_mutex_lock(&tc_mutex);
never@3156 50 guarantee(ret == 0, "fatal error with pthread_mutex_lock()");
never@3156 51 assert(tc_count == 0, "Lock acquired with illegal reentry count.");
never@3156 52 tc_owner = self;
never@3156 53 }
never@3156 54 tc_count++;
never@3156 55 }
never@3156 56
never@3156 57 ThreadCritical::~ThreadCritical() {
never@3156 58 assert(tc_owner == pthread_self(), "must have correct owner");
never@3156 59 assert(tc_count > 0, "must have correct count");
never@3156 60
never@3156 61 tc_count--;
never@3156 62 if (tc_count == 0) {
never@3156 63 tc_owner = 0;
never@3156 64 int ret = pthread_mutex_unlock(&tc_mutex);
never@3156 65 guarantee(ret == 0, "fatal error with pthread_mutex_unlock()");
never@3156 66 }
never@3156 67 }

mercurial