src/hotspot/share/compiler/abstractCompiler.cpp
changeset 47216 71c04702a3d5
parent 33160 c59f1676d27e
child 49982 9042ffe5b7fe
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 //
       
     2 // Copyright (c) 2007, 2013, 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 
       
    24 
       
    25 #include "precompiled.hpp"
       
    26 #include "compiler/abstractCompiler.hpp"
       
    27 #include "compiler/compileBroker.hpp"
       
    28 #include "runtime/mutexLocker.hpp"
       
    29 
       
    30 bool AbstractCompiler::should_perform_init() {
       
    31   if (_compiler_state != initialized) {
       
    32     MutexLocker only_one(CompileThread_lock);
       
    33 
       
    34     if (_compiler_state == uninitialized) {
       
    35       _compiler_state = initializing;
       
    36       return true;
       
    37     } else {
       
    38       while (_compiler_state == initializing) {
       
    39         CompileThread_lock->wait();
       
    40       }
       
    41     }
       
    42   }
       
    43   return false;
       
    44 }
       
    45 
       
    46 bool AbstractCompiler::should_perform_shutdown() {
       
    47   // Since this method can be called by multiple threads, the lock ensures atomicity of
       
    48   // decrementing '_num_compiler_threads' and the following operations.
       
    49   MutexLocker only_one(CompileThread_lock);
       
    50   _num_compiler_threads--;
       
    51   assert (CompileBroker::is_compilation_disabled_forever(), "Must be set, otherwise thread waits forever");
       
    52 
       
    53   // Only the last thread will perform shutdown operations
       
    54   if (_num_compiler_threads == 0) {
       
    55     return true;
       
    56   }
       
    57   return false;
       
    58 }
       
    59 
       
    60 void AbstractCompiler::set_state(int state) {
       
    61   // Ensure that state is only set by one thread at a time
       
    62   MutexLocker only_one(CompileThread_lock);
       
    63   _compiler_state =  state;
       
    64   CompileThread_lock->notify_all();
       
    65 }