src/os/solaris/vm/threadCritical_solaris.cpp

Thu, 29 May 2014 09:56:06 -0700

author
asaha
date
Thu, 29 May 2014 09:56:06 -0700
changeset 6782
f73af4455d7d
parent 4299
f34d701e952e
child 6876
710a3c8b516e
permissions
-rw-r--r--

Merge

     1 /*
     2  * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "runtime/thread.inline.hpp"
    27 #include "runtime/threadCritical.hpp"
    29 // OS-includes here
    30 #include <thread.h>
    31 #include <synch.h>
    33 //
    34 // See threadCritical.hpp for details of this class.
    35 //
    36 // For some reason, we don't do locking until the
    37 // os::init() call completes. I'm not sure why this
    38 // is, and have left it that way for now. This should
    39 // be reviewed later.
    41 static  mutex_t  global_mut;
    42 static  thread_t global_mut_owner = -1;
    43 static  int      global_mut_count = 0;
    44 static  bool     initialized = false;
    46 ThreadCritical::ThreadCritical() {
    47   if (initialized) {
    48     thread_t owner = thr_self();
    49     if (global_mut_owner != owner) {
    50       if (os::Solaris::mutex_lock(&global_mut))
    51         fatal(err_msg("ThreadCritical::ThreadCritical: mutex_lock failed (%s)",
    52                       strerror(errno)));
    53       assert(global_mut_count == 0, "must have clean count");
    54       assert(global_mut_owner == -1, "must have clean owner");
    55     }
    56     global_mut_owner = owner;
    57     ++global_mut_count;
    58   } else {
    59     assert (Threads::number_of_threads() == 0, "valid only during initialization");
    60   }
    61 }
    63 ThreadCritical::~ThreadCritical() {
    64   if (initialized) {
    65     assert(global_mut_owner == thr_self(), "must have correct owner");
    66     assert(global_mut_count > 0, "must have correct count");
    67     --global_mut_count;
    68     if (global_mut_count == 0) {
    69       global_mut_owner = -1;
    70       if (os::Solaris::mutex_unlock(&global_mut))
    71         fatal(err_msg("ThreadCritical::~ThreadCritical: mutex_unlock failed "
    72                       "(%s)", strerror(errno)));
    73     }
    74   } else {
    75     assert (Threads::number_of_threads() == 0, "valid only during initialization");
    76   }
    77 }
    79 void ThreadCritical::initialize() {
    80   // This method is called at the end of os::init(). Until
    81   // then, we don't do real locking.
    82   initialized = true;
    83 }
    85 void ThreadCritical::release() {
    86 }

mercurial