/* * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. * */ #include "precompiled.hpp" #include "runtime/threadCritical.hpp" #include "thread_linux.inline.hpp" // put OS-includes here # include // // See threadCritical.hpp for details of this class. // static pthread_t tc_owner = 0; static pthread_mutex_t tc_mutex = PTHREAD_MUTEX_INITIALIZER; static int tc_count = 0; void ThreadCritical::initialize() { } void ThreadCritical::release() { } ThreadCritical::ThreadCritical() { pthread_t self = pthread_self(); if (self != tc_owner) { int ret = pthread_mutex_lock(&tc_mutex); guarantee(ret == 0, "fatal error with pthread_mutex_lock()"); assert(tc_count == 0, "Lock acquired with illegal reentry count."); tc_owner = self; } tc_count++; } ThreadCritical::~ThreadCritical() { assert(tc_owner == pthread_self(), "must have correct owner"); assert(tc_count > 0, "must have correct count"); tc_count--; if (tc_count == 0) { tc_owner = 0; int ret = pthread_mutex_unlock(&tc_mutex); guarantee(ret == 0, "fatal error with pthread_mutex_unlock()"); } }