src/share/vm/runtime/osThread.hpp

Thu, 27 May 2010 19:08:38 -0700

author
trims
date
Thu, 27 May 2010 19:08:38 -0700
changeset 1907
c18cbe5936b8
parent 435
a61af66fc99e
child 2314
f95d63e2154a
permissions
-rw-r--r--

6941466: Oracle rebranding changes for Hotspot repositories
Summary: Change all the Sun copyrights to Oracle copyright
Reviewed-by: ohair

     1 /*
     2  * Copyright (c) 1997, 2005, 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 // The OSThread class holds OS-specific thread information.  It is equivalent
    26 // to the sys_thread_t structure of the classic JVM implementation.
    28 // The thread states represented by the ThreadState values are platform-specific
    29 // and are likely to be only approximate, because most OSes don't give you access
    30 // to precise thread state information.
    32 // Note: the ThreadState is legacy code and is not correctly implemented.
    33 // Uses of ThreadState need to be replaced by the state in the JavaThread.
    35 enum ThreadState {
    36   ALLOCATED,                    // Memory has been allocated but not initialized
    37   INITIALIZED,                  // The thread has been initialized but yet started
    38   RUNNABLE,                     // Has been started and is runnable, but not necessarily running
    39   MONITOR_WAIT,                 // Waiting on a contended monitor lock
    40   CONDVAR_WAIT,                 // Waiting on a condition variable
    41   OBJECT_WAIT,                  // Waiting on an Object.wait() call
    42   BREAKPOINTED,                 // Suspended at breakpoint
    43   SLEEPING,                     // Thread.sleep()
    44   ZOMBIE                        // All done, but not reclaimed yet
    45 };
    47 // I'd make OSThread a ValueObj embedded in Thread to avoid an indirection, but
    48 // the assembler test in java.cpp expects that it can install the OSThread of
    49 // the main thread into its own Thread at will.
    52 class OSThread: public CHeapObj {
    53   friend class VMStructs;
    54  private:
    55   //void* _start_proc;            // Thread start routine
    56   OSThreadStartFunc _start_proc;  // Thread start routine
    57   void* _start_parm;              // Thread start routine parameter
    58   volatile ThreadState _state;    // Thread state *hint*
    59   jint _interrupted;              // Thread.isInterrupted state
    61   // Note:  _interrupted must be jint, so that Java intrinsics can access it.
    62   // The value stored there must be either 0 or 1.  It must be possible
    63   // for Java to emulate Thread.currentThread().isInterrupted() by performing
    64   // the double indirection Thread::current()->_osthread->_interrupted.
    66   // Methods
    67  public:
    68   void set_state(ThreadState state)                { _state = state; }
    69   ThreadState get_state()                          { return _state; }
    71   // Constructor
    72   OSThread(OSThreadStartFunc start_proc, void* start_parm);
    74   // Destructor
    75   ~OSThread();
    77   // Accessors
    78   OSThreadStartFunc start_proc() const              { return _start_proc; }
    79   void set_start_proc(OSThreadStartFunc start_proc) { _start_proc = start_proc; }
    80   void* start_parm() const                          { return _start_parm; }
    81   void set_start_parm(void* start_parm)             { _start_parm = start_parm; }
    83   bool interrupted() const                          { return _interrupted != 0; }
    84   void set_interrupted(bool z)                      { _interrupted = z ? 1 : 0; }
    86   // Printing
    87   void print_on(outputStream* st) const;
    88   void print() const                                { print_on(tty); }
    90   // For java intrinsics:
    91   static ByteSize interrupted_offset()            { return byte_offset_of(OSThread, _interrupted); }
    93   // Platform dependent stuff
    94   #include "incls/_osThread_pd.hpp.incl"
    95 };
    98 // Utility class for use with condition variables:
    99 class OSThreadWaitState : public StackObj {
   100   OSThread*   _osthread;
   101   ThreadState _old_state;
   102  public:
   103   OSThreadWaitState(OSThread* osthread, bool is_object_wait) {
   104     _osthread  = osthread;
   105     _old_state = osthread->get_state();
   106     if (is_object_wait) {
   107       osthread->set_state(OBJECT_WAIT);
   108     } else {
   109       osthread->set_state(CONDVAR_WAIT);
   110     }
   111   }
   112   ~OSThreadWaitState() {
   113     _osthread->set_state(_old_state);
   114   }
   115 };
   118 // Utility class for use with contended monitors:
   119 class OSThreadContendState : public StackObj {
   120   OSThread*   _osthread;
   121   ThreadState _old_state;
   122  public:
   123   OSThreadContendState(OSThread* osthread) {
   124     _osthread  = osthread;
   125     _old_state = osthread->get_state();
   126     osthread->set_state(MONITOR_WAIT);
   127   }
   128   ~OSThreadContendState() {
   129     _osthread->set_state(_old_state);
   130   }
   131 };

mercurial