src/os/solaris/vm/threadCritical_solaris.cpp

Fri, 19 Dec 2008 14:40:28 -0800

author
xlu
date
Fri, 19 Dec 2008 14:40:28 -0800
changeset 934
8a25d96bcf08
parent 435
a61af66fc99e
child 1845
f03d0a26bf83
permissions
-rw-r--r--

6784100: getTimeNanos - CAS reduction
Summary: Get rid of the CAS loop in getTimeNanos to reduce coherence traffic on Solaris.
Reviewed-by: acorn, kvn, ysr

     1 /*
     2  * Copyright 2001-2003 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 #include "incls/_precompiled.incl"
    26 #include "incls/_threadCritical_solaris.cpp.incl"
    28 // OS-includes here
    29 #include <thread.h>
    30 #include <synch.h>
    32 //
    33 // See threadCritical.hpp for details of this class.
    34 //
    35 // For some reason, we don't do locking until the
    36 // os::init() call completes. I'm not sure why this
    37 // is, and have left it that way for now. This should
    38 // be reviewed later.
    40 static  mutex_t  global_mut;
    41 static  thread_t global_mut_owner = -1;
    42 static  int      global_mut_count = 0;
    43 static  bool     initialized = false;
    45 ThreadCritical::ThreadCritical() {
    46   if (initialized) {
    47     thread_t owner = thr_self();
    48     if (global_mut_owner != owner) {
    49       if (os::Solaris::mutex_lock(&global_mut))
    50         fatal1("ThreadCritical::ThreadCritical: mutex_lock failed (%s)", strerror(errno));
    51       assert(global_mut_count == 0, "must have clean count");
    52       assert(global_mut_owner == -1, "must have clean owner");
    53     }
    54     global_mut_owner = owner;
    55     ++global_mut_count;
    56   } else {
    57     assert (Threads::number_of_threads() == 0, "valid only during initialization");
    58   }
    59 }
    61 ThreadCritical::~ThreadCritical() {
    62   if (initialized) {
    63     assert(global_mut_owner == thr_self(), "must have correct owner");
    64     assert(global_mut_count > 0, "must have correct count");
    65     --global_mut_count;
    66     if (global_mut_count == 0) {
    67       global_mut_owner = -1;
    68       if (os::Solaris::mutex_unlock(&global_mut))
    69         fatal1("ThreadCritical::~ThreadCritical: mutex_unlock failed (%s)", strerror(errno));
    70     }
    71   } else {
    72     assert (Threads::number_of_threads() == 0, "valid only during initialization");
    73   }
    74 }
    76 void ThreadCritical::initialize() {
    77   // This method is called at the end of os::init(). Until
    78   // then, we don't do real locking.
    79   initialized = true;
    80 }
    82 void ThreadCritical::release() {
    83 }

mercurial