You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/08/23 18:49:21 UTC

svn commit: r434076 [7/18] - in /incubator/harmony/enhanced/drlvm/trunk: build/make/components/ build/make/components/vm/ build/make/targets/ build/patches/lnx/ build/patches/lnx/APR/ build/patches/lnx/APR/threadproc/ build/patches/lnx/APR/threadproc/u...

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/ThreadManager.htm
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/ThreadManager.htm?rev=434076&view=auto
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/ThreadManager.htm (added)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/ThreadManager.htm Wed Aug 23 09:48:41 2006
@@ -0,0 +1,2024 @@
+<!--
+    Copyright 2005-2006 The Apache Software Foundation or its licensors, as applicable.
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+   <head>
+      <meta http-equiv="Content-Type" content=
+      "text/html; charset=windows-1251">
+      <link href="drl.css" rel="stylesheet" type="text/css">
+      <title>
+         Thread Manager Description
+      </title>
+   </head>
+   <body>
+      <p class="title" style="text-align: center">
+         <a name="top"></a>Thread Manager
+      </p>
+      <p style="text-align: center">
+         Component Description
+      </p>
+      <p class="TOCHeading">
+         <a href="#RevisionHistory">1. Revision History</a>
+      </p>
+      <p class="TOCHeading">
+         <a href="#Disclaimer_and_Legal_Information">2. Disclaimer
+         and Legal Information</a>
+      </p>
+      <p class="TOCHeading">
+         <a href="#About_This_Document">3. About this Document</a>
+      </p>
+      <p class="TOC">
+         <a href="#Purpose">3.1 Purpose</a>
+      </p>
+      <p class="TOC">
+         <a href="#Intended_Audience">3.2 Intended Audience</a>
+      </p>
+      <p class="TOC">
+         <a href="#Documentation_Conventions">3.3 Documentation
+         Conventions</a>
+      </p>
+      <p class="TOC">
+         <a href="#Using_this_document">3.4 Using this Document</a>
+      </p>
+      <p class="TOCHeading">
+         <a href="#Overview">4. Overview</a>
+      </p>
+      <p class="TOC">
+         <a href="#Key_Feature">4.1 Key Features</a>
+      </p>
+      <p class="TOC">
+         <a href="#TM_in_VM">4.2 Thread Manager in VM</a>
+      </p>
+      <p class="TOC">
+         <a href="#Portability">4.3 Portability</a>
+      </p>
+      <p class="TOCHeading">
+         <a href="#Achitecture">5. Architecture</a>
+      </p>
+      <p class="TOC">
+         <a href="#Exported_Interfaces">5.1 Exported interfaces</a>
+      </p>
+      <blockquote>
+         <p class="TOC">
+            <a href="#Native_Layer">5.1.1 Native Interface</a>
+         </p>
+         <p class="TOC">
+            <a href="#Java_interface">5.1.2 Java* Interface</a>
+         </p>
+      </blockquote>
+      <p class="TOC">
+         <a href="#Data_Structures">5.2 Data structures</a>
+      </p>
+      <p class="TOC">
+         <a href="#Thread_Control_Structure">5.3 Thread control
+         structures</a>
+      </p>
+      <blockquote>
+         <p class="TOC">
+            <a href="#Native_Structure">5.3.1 Native Thread
+            Structure</a>
+         </p>
+         <p class="TOC">
+            <a href="#Java_Structure">5.3.2 Java* Thread
+            Structure</a>
+         </p>
+      </blockquote>
+      <p class="TOC">
+         <a href="#Thread_Group">5.4 Thread Groups</a>
+      </p>
+      <p class="TOC">
+         <a href="#Synchronizer">5.5 Synchronizers</a>
+      </p>
+      <p class="TOC">
+         <a href="#Monitors">5.6 Monitors</a>
+      </p>
+      <blockquote>
+         <p class="TOC">
+            <a href="#MonitorInflation">5.6.1 Inflation Technique</a>
+         </p>
+         <p class="TOC">
+            <a href="#Thin_monitors">5.6.2 Monitor Structure</a>
+         </p>
+         <p class="TOC">
+            <a href="#AcquireMonitor">5.6.3 Acquiring a Monitor</a>
+         </p>
+      </blockquote>
+      <p class="TOCHeading">
+         <a href="#Usage_Scenarios">6. Usage scenarios</a>
+      </p>
+      <p class="TOC">
+         <a href="#Thread_lifecycle">6.1 Java* Thread Life Cycle</a>
+      </p>
+      <p class="TOC">
+         <a href="#Thread_suspension">6.2 Thread Suspension</a>
+      </p>
+      <p class="TOC">
+         <a href="#Stop-the-world_Suspension">6.3 Stop-the-world
+         Thread Suspension</a>
+      </p>
+      <p class="TOC">
+         <a href="#Thread_locking">6.4 Thread Locking</a>
+      </p>
+      <p class="TOC">
+         <a href="#Monitor_scenarios">6.5 Monitor Enter and Exit</a>
+      </p>
+      <p class="TOCHeading">
+         <a href="#References">7. References</a>
+      </p>
+      <h1>
+         <a name="RevisionHistory"></a>1. Revision History
+      </h1>
+      <table border="0" cellpadding="0" width="100%">
+         <tr>
+            <td class="TableHeading">
+               Version
+            </td>
+            <td class="TableHeading">
+               Version Information
+            </td>
+            <td class="TableHeading">
+               Date
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               Initial version
+            </td>
+            <td class="TableCell">
+               Nadya Morozova, Andrey Chernyshev: document created.
+            </td>
+            <td class="TableCell">
+               June 5, 2006
+            </td>
+         </tr>
+      </table>
+      <h1>
+         <a name="Disclaimer_and_Legal_Information"></a>2. Disclaimer
+         and Legal Information
+      </h1>
+      <p>
+         Copyright 2006 The Apache Software Foundation or its
+         licensors, as applicable.
+      </p>
+      <p>
+         Licensed under the Apache License, Version 2.0 (the
+         License); you may not use this file except in compliance
+         with the License. You may obtain a copy of the License at <a
+         href="http://www.apache.org/licenses/LICENSE-2.0" target= 
+         "_blank">http://www.apache.org/licenses/LICENSE-2.0</a>.
+      </p>
+      <p>
+         Unless required by applicable law or agreed to in writing,
+         software distributed under the License is distributed on an
+         AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+         either express or implied. See the License for the specific
+         language governing permissions and limitations under the
+         License.
+      </p>
+      <p class="backtotop">
+         <a href="#top">Back to Top</a>
+      </p>
+      <h1>
+         <a name="About_This_Document"></a>3. About This Document
+      </h1>
+      <h2>
+         <a name="Purpose"></a>3.1 Purpose
+      </h2>
+      <p>
+         This document introduces the thread manager component
+         delivered as part of the DRL (Dynamic Runtime Layer)
+         initiative. This document focuses on the specifics of the
+         current implementation showing the thread manager role
+         inside the DRL virtual machine, and the internal
+         organization of the thread management subsystem.
+      </p>
+      <h2>
+         <a name="Intended_Audience"></a>3.2 Intended Audience
+      </h2>
+      <p>
+         The target audience for the document includes a wide
+         community of engineers interested in further work with
+         threading technologies to contribute to their development.
+         The document assumes that readers are familiar with DRLVM
+         architecture basics, threading methodologies and structures.
+      </p>
+      <h2>
+         <a name="Documentation_Conventions"></a>3.3 Documentation
+         Conventions
+      </h2>
+      <p>
+         This document uses the <a href="conventions.htm" target= 
+         "_blank">unified conventions</a> for the DRL documentation
+         kit.
+      </p>
+      <h2>
+         <a name="Using_this_document"></a>3.4 Using this Document
+      </h2>
+      <p>
+         Use this document to learn all about implementation
+         specifics of the current version. It describes the thread
+         manager functionality in a variety of aspects, including
+         internal data structures, architecture specifics, and the
+         key usage scenarios involving the thread manager. The
+         document has the following major parts:
+      </p>
+      <ul>
+         <li>
+            <a href="#Overview">Overview</a> gives the general
+            definition of the thread manager component and its role
+            in the VM architecture.
+         
+         <li>
+            <a href="#Achitecture">Architecture</a> describes the
+            internal structure of the thread manager, its data
+            structures and the interfaces it exports.
+         
+         <li>
+            <a href="#Usage_Scenarios">Usage scenarios</a>
+            demonstrate major thread-related operations, such as the
+            thread life cycle and thread suspension.
+         
+         <li>
+            <a href="#References">References</a> are links to
+            materials relevant to this description.
+         
+      </ul>
+      <p class="backtotop">
+         <a href="#top">Back to Top</a>
+      </p>
+      <h1>
+         <a name="Overview"></a>4. Overview
+      </h1>
+      <p>
+         The thread manager (TM) is a library aimed to provide
+         threading capabilities for Java<a href="#*">*</a> virtual
+         machines. The main purpose of TM is to build a bridge
+         between the POSIX-like threading model [<a href=
+         "#posix_ref">5</a>] provided by the operating system, and
+         the Java<a href="#*">*</a>-like threading model implied by
+         the J2SE specification [<a href="#J2SESpec">1</a>].
+      </p>
+      <p>
+         In the current implementation, the JVM threading subsystem
+         consists of three different layers:
+      </p>
+      <ul>
+         <li>
+            The <a href="#Portability">porting layer</a> interacting
+            with the operating system
+         
+         <li>
+            The <a href="#Native_Layer">native layer</a> providing
+            basic threading functionality
+         
+         <li>
+            The <a href="#Java_interface">Java* layer</a> interacting
+            with the Java<a href="#*">*</a> objects of the user
+            application
+         
+      </ul>
+      <p>
+         Note that the thread manager consists of the native and
+         Java<a href="#*">*</a> layers of the subsystem, whereas as
+         the porting layer is external.
+      </p>
+      <p>
+         Each layer adds certain functionality to the threading
+         provided by the underlying layer. That is, the porting layer
+         adds portability to the threading provided by OS, the native
+         layer adds Java<a href="#*">*</a>-specific enhancements to
+         the porting layer, and the Java<a href="#*">*</a> layer adds
+         a connection to Java<a href="#*">*</a> threads and objects
+         to the native layer, as shown in Figure 1 below. These
+         interfaces are grouped in a set of headers described in the
+         <a href="#Exported_Interfaces">Exported Interfaces</a>
+         section below.
+      </p>
+      <p style="text-align: center">
+         <img src="images/ThreadingSystem.gif" alt=
+         "Basic layers in the thread manager">
+      </p>
+      <p class="special">
+         Figure 1: Threading Subsystem
+      </p>
+      <p class="backtotop">
+         <a href="#top">Back to Top</a>
+      </p>
+      <h2>
+         <a name="Key_Feature"></a>4.1 Key features
+      </h2>
+      <p>
+         The supplied thread manager has the following
+         characteristics:
+      </p>
+      <ul>
+         <li>
+            Support for the threading functionality required by J2SE
+            API [<a href="#J2SESpec">1</a>], JVMTI [<a href= 
+            "#JVMTI_ref">2</a>] and JNI [<a href="#JNI_ref">3</a>]
+            specifications
+         
+         <li>
+            Portable implementation mostly based on the Apache
+            Porting Layer [<a href="#APR_ref">4</a>]
+         
+         <li>
+            Compliance with the Harmony <code>hythread</code>
+            interface [<a href="#hythread_ref">8</a>]
+         
+         <li>
+            Support for the garbage collector
+         
+         <li>
+            Monitor optimizations specific to the just-in-time (JIT)
+            compiler supplied with DRLVM
+         
+      </ul>
+      <h2>
+         <a name="TM_in_VM"></a>4.2 Thread Manager in VM
+      </h2>
+      <p>
+         Figure 2 below demonstrates the interaction of the thread
+         manager with the following components of the virtual
+         machine:
+      </p>
+      <ul>
+         <li>
+            <b>The VM core</b> to access information on object layout
+            and for binding between <code>java.lang.Thread</code>
+            objects and appropriate native threads. For that, the
+            thread manager queries the
+            <code>thread_externals.h</code> interface of the VM core.
+         
+         <li>
+            <b>The garbage collector</b> to serve thread manipulation
+            requests for root set enumeration and garbage collection
+            activities. GC works with the native layer of the thread
+            manager.
+         
+         <li>
+            <b>The porting layer</b> to interact with the underlying
+            system and enable <a href="#Portability">portability</a>
+            for threading. The TM native layer queries functions of
+            the APR interfaces and the apr_thread_ext interface.
+         
+         <li>
+            <b>The just-in-time compiler</b> to provide optimized
+            threading functions, called VM helpers, for JIT-compiled
+            code. The thread manager exports this functionality via
+            the <code>thread_helpers</code> interface of the Java<a
+            href="#*">*</a> layer.
+         
+      </ul>
+      <p style="text-align: center">
+         <img src="images/tm_in_vm.gif" alt=
+         "Thread Manager and other VM components">
+      </p>
+      <p class="special">
+         Figure 2: Thread Manager in VM Architecture
+      </p>
+      <h2>
+         <a name="Portability"></a>4.3 Portability
+      </h2>
+      <p>
+         The thread manager code is mostly platform-independent and
+         relies on the underlying porting layer to adjust to platform
+         specifics. The current TM implementation is written on top
+         of the Apache Porting Layer (APR) with certain extensions
+         added to it. The platform-dependent TM parts are the VM
+         helpers package, which is tied to the specific architecture,
+         and the APR extensions package, which is partially tied with
+         the OS API.
+      </p>
+      <p>
+         APR-based porting enables compilation of the thread manager
+         code on every platform where APR is available. The current
+         version of the thread manager supports the Linux<a href=
+         "#*">*</a> and Windows<a href="#*">*</a> IA-32 platforms.
+      </p>
+      <p class="backtotop">
+         <a href="#top">Back to Top</a>
+      </p>
+      <h1>
+         <a name="Achitecture"></a>5. Architecture
+      </h1>
+      <p>
+         Subsequent sections describe the functional interfaces that
+         the thread manager exports to interact with other VM
+         components and its internal data structures.
+      </p>
+      <h2>
+         <a name="Exported_Interfaces"></a>5.1 Exported interfaces
+      </h2>
+      <p>
+         As indicated in the overview, the thread manager exports the
+         native and the Java<a href="#*">*</a> interfaces. These
+         interfaces are represented as groups of functions providing
+         specific functionality upon external requests, as described
+         in the subsequent sections.
+      </p>
+      <h3>
+         <a name="Native_Layer"></a>5.1.1 Native Interface
+      </h3>
+      <p>
+         The native interface is inspired by the Harmony
+         <code>hythread</code> module. This is a low-level layer that
+         provides Java<a href="#*">*</a>-like threading
+         functionality, such as interruption support for waiting
+         operations (for example, <code>wait</code>, 
+         <code>park</code>, <code>join</code> and <code>sleep</code>)
+         and helps establish correct interaction of threads with the
+         garbage collector. This layer does not deal with Java<a
+         href="#*">*</a> objects.
+      </p>
+      <p>
+         The native interface consists of the following function
+         sets:
+      </p>
+      <p class="class">
+          <code>hythread.h</code>
+      </p>
+      <p>
+         Functions of the <code>hythread</code> set [<a href= 
+         "#hythread_ref">8</a>] responsible for:
+      </p>
+      <ul>
+         <li>
+            Basic manipulation
+         
+         <li>
+            Parking
+         
+         <li>
+            Thread local storage support
+         
+         <li>
+            Read-write mutex support
+         
+         <li>
+            Monitors support
+         
+      </ul>
+      <p class="class">
+          <code>hythread_ext.h</code>
+      </p>
+      <p>
+         Set of functions extending the <code>hythread</code> set
+         responsible for:
+      </p>
+      <ul>
+         <li>
+            Thread manager initialization and shutdown
+         
+         <li>
+            Thread groups support
+         
+         <li>
+            Conditional variable
+         
+         <li>
+            Safe suspension support
+         
+         <li>
+            Latch
+         
+         <li>
+            Thread iterator support
+         
+         <li>
+            Attributes access
+         
+         <li>
+            Querying state of the thread
+         
+         <li>
+            Semaphore
+         
+         <li>
+            Mutex
+         
+         <li>
+            Thin monitors support
+         
+         <li>
+            Querying the thread state
+         
+         <li>
+            Thread attributes access
+         
+         <li>
+            Interruption support
+         
+         <li>
+            Task management support
+         
+      </ul>
+      <p class="backtotop">
+         <a href="#top">Back to Top</a>
+      </p>
+      <h3>
+         <a name="Java_interface"></a>5.1.2 Java<a href="#*">*</a>
+         Interface
+      </h3>
+      <p>
+         The Java<a href="#*">*</a> interface connects the threading
+         functionality provided by the native layer to Java<a href=
+         "#*">*</a> threads and objects.
+      </p>
+      <p>
+         The functions of the Java<a href="#*">*</a> interface take
+         Java<a href="#*">*</a> objects as parameters and can be
+         easily used to implement kernel classes, JNI or JVMTI
+         function sets. The Java<a href="#*">*</a> interface consists
+         of 3 parts:
+      </p>
+      <p class="class">
+          <code>jthread.h</code>
+      </p>
+      <p>
+         Functions supporting <code>java.lang.Object</code> and
+         <code>java.lang.Thread</code> API responsible for:
+      </p>
+      <ul>
+         <li>
+            Basic manipulation
+         
+         <li>
+            Identification
+         
+         <li>
+            Pointer conversion
+         
+         <li>
+            Attributes access
+         
+         <li>
+            Interruption
+         
+         <li>
+            Monitors
+         
+         <li>
+            Parking
+         
+         <li>
+            Suspension
+         
+      </ul>
+      <p class="class">
+          <code>ti_thread.h</code>
+      </p>
+      <p>
+         Functions supporting various JVMTI functions and the
+         <code>java.lang.management</code> API responsible for:
+      </p>
+      <ul>
+         <li>
+            State query
+         
+         <li>
+            Instrumentation
+         
+         <li>
+            Local storage
+         
+         <li>
+            Monitor info
+         
+         <li>
+            CPU timing
+         
+         <li>
+            Peak count
+         
+         <li>
+            Raw monitors
+         
+      </ul>
+      <p class="class">
+          <code>thread_helpers.h</code>
+      </p>
+      <p>
+         Functions providing the stubs that help to optimize the
+         performance due to tighter TM and JIT integration.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h2>
+         <a name="Data_Structures"></a>5.2 Data structures
+      </h2>
+      <p>
+         The thread manager data structures are typically not
+         exposed: external VM components access these structures via
+         opaque pointers instead. The pointers are defined in the
+         public header files <code>hythread.h</code>,
+         <code>hythread_ext.h</code>, <code>jthread.h</code> and
+         <code>ti_thread.h</code>. Structures themselves are
+         described in the <code>thread_private.h</code> file.
+      </p>
+      <h2>
+         <a name="Thread_Control_Structure"></a>5.3 Thread control
+         structures
+      </h2>
+      <p>
+         The thread manager requires each thread to be
+         <em>registered</em> before threading functions can be
+         called. Thread registration is called <em>attaching a
+         thread</em> and can be done by using one of the following:
+      </p>
+      <ul>
+         <li>
+            Function <code>hythread_attach()</code> registers the
+            current thread in the thread manager, so that threading
+            operations can be performed over this thread via the
+            native layer.
+         
+         <li>
+            Function <code>jthread_attach()</code> associates the
+            current thread with the appropriate
+            <code>java.lang.Thread</code> object, so that threading
+            operations can be performed over this thread via the
+            Java<a href="#*">*</a> layer.
+         
+      </ul>
+      <p>
+         Depending on the attaching function, the thread manager
+         operates with two types of threads:
+      </p>
+      <ul>
+         <li>
+            <em>Native thread</em> attached to the native layer of
+            the thread manager
+         
+         <li>
+            <em>Java<a href="#*">*</a> thread</em> attached to the
+            Java<a href="#*">*</a> layer of the thread manager and
+            associated with a <code>java.lang.Thread</code> object
+         
+      </ul>
+      <p>
+         Each thread type has a structure assigned to it that holds
+         thread-specific data, as described below.
+      </p>
+      <p>
+         Other VM components work with opaque handles to those
+         structures and have no information about their contents.
+         This way, to work with a thread, a component calls one of
+         the attaching functions, receives an opaque handle to the
+         thread control structure for the thread, and performs
+         whatever operations with this thread using this opaque
+         handle.
+      </p>
+      <h3>
+         <a name="Native_Structure"></a>5.3.1 Native Thread Structure
+      </h3>
+      <p>
+         When registered with the thread manager&rsquo;s native
+         layer, each thread obtains a control structure with all
+         thread-specific data required for operations with the
+         thread, such as state, attributes, references to OS-specific
+         thread structures, and synchronization aids. The control
+         structure is subsequently used for miscellaneous threading
+         operations.
+      </p>
+      <p class="note">
+         Note
+      </p>
+      <p class="notetext">
+         The actual content of a thread control structure is
+         implementation-specific and is not exposed to other
+         components.  
+      </p>
+      <p>
+         The following figure shows the thread control structure of a
+         native attached thread described by the type
+         <code>HyThread</code>:
+      </p>
+      <p style="text-align: center">
+         <img border="0" src="images/NativeUnattachedThread.gif" alt=
+         "Structure of a native thread not registered in TM">
+      </p>
+      <p class="special">
+         Figure 3:  Native Thread
+      </p>
+      <p>
+         The following table lists the data fields making up the
+         thread control structure of a native thread:
+      </p>
+      <table width="100%">
+         <tr>
+            <td colspan="2" class="TableHeading">
+               Data Field
+            </td>
+            <td class="TableHeading">
+               Description
+            </td>
+         </tr>
+         <tr>
+            <td colspan="3" class="TableCell">
+               <strong>Suspension</strong> 
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>IDATA</code> 
+            </td>
+            <td class="TableCell">
+               <code>suspend_request</code> 
+            </td>
+            <td class="TableCell">
+               Number of suspend requests made for this thread.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>int16 </code> 
+            </td>
+            <td class="TableCell">
+               <code>suspend_disable_count</code> 
+            </td>
+            <td class="TableCell">
+               Flag indicating that the thread can safely be
+               suspended.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hylatch_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>safe_region_event</code> 
+            </td>
+            <td class="TableCell">
+               Event used to notify interested threads when a thread
+               enters a safe region.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hysem_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>resume_event</code> 
+            </td>
+            <td class="TableCell">
+               Event used to notify a suspended thread that it needs
+               to wake up.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hythread_event_callback_proc </code> 
+            </td>
+            <td class="TableCell">
+               <code>safepoint_callback</code> 
+            </td>
+            <td class="TableCell">
+               Function to be executed at a safe point on resuming a
+               thread.
+            </td>
+         </tr>
+         <tr>
+            <td colspan="3" class="TableCell">
+               <strong>Basic manipulation fields</strong> 
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hythread_group_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>group</code> 
+            </td>
+            <td class="TableCell">
+               Group for this thread equal to the address of the head
+               of the list of threads for this group.<br>
+                Groups are used to quickly iterate over lists of
+               threads. Examples: Java<a href="#*">*</a> threads, GC
+               private threads.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hythread_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>next</code> 
+            </td>
+            <td class="TableCell">
+               Pointer to the next thread within the group.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hythread_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>prev</code> 
+            </td>
+            <td class="TableCell">
+               Pointer to the last thread within the group.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>apr_thread_t * </code> 
+            </td>
+            <td class="TableCell">
+               <code>os_handle</code> 
+            </td>
+            <td class="TableCell">
+               Handle to the OS thread.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>void * </code> 
+            </td>
+            <td class="TableCell">
+               <code>private_data</code> 
+            </td>
+            <td class="TableCell">
+               Placeholder for any data to be associated with this
+               thread. The Java<a href="#*">*</a> layer uses this
+               field to store Java-specific context.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>Boolean </code> 
+            </td>
+            <td class="TableCell">
+               <code>exit_request</code> 
+            </td>
+            <td class="TableCell">
+               Flag indicating that a request to exit has been
+               received.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>IDATA </code> 
+            </td>
+            <td class="TableCell">
+               <code>exit_value</code> 
+            </td>
+            <td class="TableCell">
+               Exit value of this thread.
+            </td>
+         </tr>
+         <tr>
+            <td colspan="3" class="TableCell">
+               <strong>Synchronization support</strong> 
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hysem_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>park_event</code> 
+            </td>
+            <td class="TableCell">
+               Event for parking threads.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hysem_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>sleep_event</code> 
+            </td>
+            <td class="TableCell">
+               Event for sleeping threads.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hylatch_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>join_event</code> 
+            </td>
+            <td class="TableCell">
+               Event reserved for threads that invoke join.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hycond_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>current_condition</code> 
+            </td>
+            <td class="TableCell">
+               Current conditional variable that the thread is
+               waiting on. Used for interrupting.
+            </td>
+         </tr>
+         <tr>
+            <td colspan="3" class="TableCell">
+               <strong>State</strong> 
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>IDATA </code> 
+            </td>
+            <td class="TableCell">
+               <code>state</code> 
+            </td>
+            <td class="TableCell">
+               Thread state. Holds thread state flags as defined in
+               the JVMTI specification [<a href="#JVMTI_ref">2</a>]
+               plus additional flags.
+            </td>
+         </tr>
+         <tr>
+            <td colspan="3" class="TableCell">
+               <strong>Attributes</strong> 
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>char * </code> 
+            </td>
+            <td class="TableCell">
+               <code>name</code> 
+            </td>
+            <td class="TableCell">
+               Name of the thread, can be used for debugging.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>IDATA </code> 
+            </td>
+            <td class="TableCell">
+               <code>priority</code> 
+            </td>
+            <td class="TableCell">
+               Hint to the scheduler about thread priority.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>IDATA </code> 
+            </td>
+            <td class="TableCell">
+               <code>daemon</code> 
+            </td>
+            <td class="TableCell">
+               Checks whether this thread is a daemon.
+            </td>
+         </tr>
+         <tr>
+            <td colspan="3" class="TableCell">
+               <strong>Other</strong> 
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>IDATA </code> 
+            </td>
+            <td class="TableCell">
+               <code>thread_id</code> 
+            </td>
+            <td class="TableCell">
+               ID for this thread. The maximum number of threads is
+               governed by the size of the lock word record. See
+               section <a href="#Thin_monitors">Thin Monitors</a> for
+               details on the lock word structure.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>apr_pool_t * </code> 
+            </td>
+            <td class="TableCell">
+               <code>pool</code> 
+            </td>
+            <td class="TableCell">
+               Memory pool, where this thread is allocated.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>apr_threadattr_t * </code> 
+            </td>
+            <td class="TableCell">
+               <code>apr_attrs</code> 
+            </td>
+            <td class="TableCell">
+               APR thread attributes.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hythread_entrypoint_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>start_proc</code> 
+            </td>
+            <td class="TableCell">
+               Procedure that describes thread body to be executed.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>void * </code> 
+            </td>
+            <td class="TableCell">
+               <code>start_proc_args</code> 
+            </td>
+            <td class="TableCell">
+               Arguments to be passed to the thread body.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>void * </code> 
+            </td>
+            <td class="TableCell">
+               <code>thread_local_storage</code> 
+            </td>
+            <td class="TableCell">
+               Array representing the thread local storage.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>void * </code> 
+            </td>
+            <td class="TableCell">
+               <code>big_local_storage</code> 
+            </td>
+            <td class="TableCell">
+               Extension to the standard local storage slot.
+            </td>
+         </tr>
+      </table>
+      <p>
+         For details on thread control structures, see the
+         <code>thread_private.h</code> header file supplied with the
+         source bundle.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h3>
+         <a name="Java_Structure"></a>5.3.2 Java<a href="#*">*</a>
+         Thread Structure
+      </h3>
+      <p>
+         A thread control structure of a Java<a href="#*">*</a>
+         thread is defined by the <code>JVMTIThread</code> type and
+         holds mostly JVMTI information specific to that thread, as
+         shown in Figure 4 below.
+      </p>
+      <p class="special">
+         <img src="images/JavaAttached.gif" alt=
+         "Structure of the Java* Attached thread">
+      </p>
+      <p class="special">
+         Figure 4: Java<a href="#*">*</a> Attached Thread
+      </p>
+      <p>
+         The following table lists the data fields making up the
+         thread control structure of a Java<a href="#*">*</a> thread:
+      </p>
+      <table width="100%">
+         <tr>
+            <td colspan="2" class="TableHeading">
+               Data Field
+            </td>
+            <td class="TableHeading">
+               Description
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>JNIEnv * </code> 
+            </td>
+            <td class="TableCell">
+               <code>jenv</code> 
+            </td>
+            <td class="TableCell">
+               JNI environment variable associated with this Java<a
+               href="#*">*</a> thread.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>jthread </code> 
+            </td>
+            <td class="TableCell">
+               <code>thread_object</code> 
+            </td>
+            <td class="TableCell">
+               The object <code>jthread</code> associated with
+               <code>hythread_t</code>.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>hycond_t </code> 
+            </td>
+            <td class="TableCell">
+               <code>monitor_condition</code> 
+            </td>
+            <td class="TableCell">
+               Conditional variable used to wait/notify Java<a href= 
+               "#*">*</a> monitors.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>jthrowable </code> 
+            </td>
+            <td class="TableCell">
+               <code>stop_exception</code> 
+            </td>
+            <td class="TableCell">
+               Exception to be thrown in a stopped thread.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>jlong </code> 
+            </td>
+            <td class="TableCell">
+               <code>blocked_time</code> 
+            </td>
+            <td class="TableCell">
+               Time duration of the thread blocked on a monitor, in
+               nanoseconds.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>jlong </code> 
+            </td>
+            <td class="TableCell">
+               <code>waited_time</code> 
+            </td>
+            <td class="TableCell">
+               Time duration of the thread waiting on a monitor, in
+               nanoseconds.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>JVMTILocalStorage </code> 
+            </td>
+            <td class="TableCell">
+               <code>jvmti_local_storage</code> 
+            </td>
+            <td class="TableCell">
+               JVMTI local storage.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>jobject </code> 
+            </td>
+            <td class="TableCell">
+               <code>contended_monitor</code> 
+            </td>
+            <td class="TableCell">
+               Monitor that this thread is blocked on.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>jobject </code> 
+            </td>
+            <td class="TableCell">
+               <code>wait_monitor</code> 
+            </td>
+            <td class="TableCell">
+               Monitor that this thread is waiting on.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>jobject * </code> 
+            </td>
+            <td class="TableCell">
+               <code>owned_monitors</code> 
+            </td>
+            <td class="TableCell">
+               Monitors owned by this thread.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>int </code> 
+            </td>
+            <td class="TableCell">
+               <code>owned_monitors_nmb</code> 
+            </td>
+            <td class="TableCell">
+               The counter for the monitors owned by the thread.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>apr_pool_t * </code> 
+            </td>
+            <td class="TableCell">
+               <code>pool</code> 
+            </td>
+            <td class="TableCell">
+               APR pool for this structure.
+            </td>
+         </tr>
+         <tr>
+            <td class="TableCell">
+               <code>jobject </code> 
+            </td>
+            <td class="TableCell">
+               <code>thread_ref</code> 
+            </td>
+            <td class="TableCell">
+               Weak reference to the corresponding
+               <code>java.lang.Thread</code> instance.
+            </td>
+         </tr>
+      </table>
+      <p>
+         For details on thread control structures, see the
+         <code>thread_private.h</code> header file supplied with the
+         source bundle.
+      </p>
+      <p>
+         The data structures associated with a thread attached to a
+         <code>java.lang.Thread</code> object and for a standalone
+         (unattached) thread are shown in Figures 3 and 4
+         respectively.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h2>
+         <a name="Thread_Group"></a>5.4 Thread Groups
+      </h2>
+      <p>
+         The thread manager enables co-existence of multiple groups
+         of threads, for example, groups of Java<a href="#*">*</a>
+         threads and GC threads not visible for Java<a href=
+         "#*">*</a> applications. Each thread maintained by the
+         thread manager belongs to a specific thread group, as shown
+         in Figure 5.
+      </p>
+      <p style="text-align: center">
+         <img src="images/thread_groups.gif" alt=
+         "Threads distributed into thread groups, for example a group of Java* threads and a group of GC threads">
+      </p>
+      <p class="special">
+         Figure 5: Thread Groups
+      </p>
+      <p>
+         The thread manager provides a set of functions for iterating
+         over the list of threads within a specific group. All
+         threads are organized in a group array and a specific
+         system-wide lock is used to prevent concurrent modifications
+         of the groups array and the thread list inside the group.
+         This lock is acquired internally during thread creation,
+         deletion and iteration over the thread list.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h2>
+         <a name="Synchronizer"></a>5.5 Synchronizers
+      </h2>
+      <p>
+         The thread manager synchronizers are functional modules used
+         for thread synchronization. Certain synchronizers have
+         internal data structures associated with them, others can
+         only delegate function calls to the appropriate
+         synchronizers provided by APR. The current implementation of
+         synchronizers within the thread manager is based on two
+         fundamental primitives: the conditional variable and the
+         mutex, as shown in Figure 6.
+      </p>
+      <p style="text-align: center">
+         <img src="images/Synchronizer_mutex.gif" alt=
+         "Implementing the thread synchronizer in TM" border="0">
+      </p>
+      <p class="special">
+         Figure 6: Components of the TM Synchronizer 
+      </p>
+      <p>
+         The elements in the figure have the following meaning:
+      </p>
+      <ul>
+         <li>
+            The APR conditional variable and APR mutex are basic
+            primitives provided by the Apache Portable Runtime.
+         
+         <li>
+            The TM conditional variable and TM mutex wrap appropriate
+            APR primitives by adding the <code>wait</code>
+            interruption support. These synchronizers also ensure
+            that a thread enters the safe suspension mode when it is
+            put into a <code>wait</code> state using the conditional
+            variable or when the thread is blocked while acquiring a
+            mutex.
+         
+         <li>
+            The <a href="#Thin_monitors">thin monitor</a> is an
+            inflatable lock coupled with the condition variable. This
+            combination serves as a base for building Java<a href=
+            "#*">*</a> monitors.
+         
+         <li>
+            The semaphore is the same as the POSIX semaphore, and
+            also enables specifying the count limit.
+         
+         <li>
+            The Java<a href="#*">*</a> monitor is the same as
+            <code>java.lang.Object</code>.
+         
+         <li>
+            The JVMTI raw monitor is the monitor defined in the JVMTI
+            specification.
+         
+         <li>
+            The <code>park</code> and <code>unpark</code> lock
+            support primitives are used in the
+            <code>java.util.concurrent</code> package.
+         
+      </ul>
+      <p>
+         The above hierarchy is optimized for APR code re-use. Other
+         implementations of the Thread Manager component are also
+         possible and can utilize a different set of APR
+         synchronizers.
+      </p>
+      <p class="note">
+         Note
+      </p>
+      <p class="notetext">
+         The thread manager does not expose the internal structures
+         of synchronizers to the external components. All
+         synchronizers are referenced by means of opaque handles
+         similarly to thread control structures.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h2>
+         <a name="Monitors"></a>5.6 Monitors
+      </h2>
+      <p>
+         The current version of the thread manager implements Java<a
+         href="#*">*</a> monitors in a specific way to address the
+         common problem of space comsumption. The DRL thread manager
+         provides has a special type of monitor, <em>thin
+         monitor,</em> holding the lock optimized for space
+         consumption and single-threaded usage.
+      </p>
+      <h3>
+         <a name="MonitorInflation"></a>5.6.1 Inflation technique
+      </h3>
+      <p>
+         Monitor inflation is implemented using a thin-fat lock
+         technique [<a href="#thin_lock_ref">6</a>], which works as
+         follows:
+      </p>
+      <ul>
+         <li>
+            In the absence of thread contention, lock data are stored
+            in a few bytes, so that the lock can be allocated
+            directly within the Java<a href="#*">*</a> object.
+         
+         <li>
+            Whenever contention takes place, the bytes allocated for
+            lock data hold a reference to the fat lock, which can be
+            conventional mutex.
+         
+      </ul>
+      <p>
+         Different implementations of thin monitors are free to
+         choose any space compaction or other optimization techniques
+         (or none at all). However, the general recommendation is to
+         use thin monitors when memory needs to be saved and a thread
+         contention is not expected to be high. It is also
+         recommended that the conventional mutex and conditional
+         variables be used to achieve the better scalability in case
+         of high contention. Java<a href="#*">*</a> monitors in the
+         thread manager are built on top of thin monitors. This
+         enables the thread manager to allocate the lock structure
+         for thin monitors directly in the Java<a href="#*">*</a>
+         objects and thus makes Java<a href="#*">*</a> monitors space
+         usage more efficient.
+      </p>
+      <h3>
+         <a name="Thin_monitors"></a>5.6.2 Monitor Structure
+      </h3>
+      <p>
+         The thin monitor is a synchronizer primitive that implements
+         the lock compression technique and serves as a base for
+         building Java<a href="#*">*</a> monitors [<a href= 
+         "#thin_lock_ref">6</a>]. In other words, the thin monitor
+         resides in the native layer of the TM subsystem and has no
+         data on Java<a href="#*">*</a> objects. Java<a href=
+         "#*">*</a> monitors are tightly coupled with Java<a href=
+         "#*">*</a> objects and reside on the higher Java<a href=
+         "#*">*</a> level of the TM subsystem.
+      </p>
+      <p>
+         The central point of the synchronizer is the <em>lock
+         word</em>, which holds the thin lock value or a reference to
+         the fat lock depending on the contention.
+      </p>
+      <p>
+         In the absence of contention, the lock type is zero, and the
+         lock word has the following structure:
+      </p>
+      <p style="text-align: center">
+         <img src="images/uninflated_lockword.gif" alt=
+         "uninflated loack" border="0">
+      </p>
+      <p class="special">
+         Figure 7: Lock Word Structure: Contention Bit is 0
+      </p>
+      <ul>
+         <li>
+            Contention bit : 0 indicating that absence of contention
+         
+         <li>
+            Thread ID (15 bits): the ID of the owning thread, or 0 if
+            the lock is free
+         
+         <li>
+            Recursion count: the number of times that the lock has
+            been acquired by the same thread minus 1
+         
+         <li>
+            Reservation bit: the flag indicating whether the lock is
+            reserved by a thread [<a href="#lock_overhead_ref">7</a>]
+         
+         <li>
+            Rightmost 10 bits unused in TM and reserved for storing
+            the hash codes of Java<a href="#*">*</a> objects
+         
+      </ul>
+      <p>
+         In the presence of contention, the contention bit is set to
+         1, and a thin compressed lock becomes a fat inflated lock
+         with the following layout:
+      </p>
+      <p style="text-align: center">
+         <img alt="inflated lock" border="0" src= 
+         "images/inflated_lockword.gif">
+      </p>
+      <p class="special">
+         Figure 8: Lock Word Structure: Contention Bit is 1
+      </p>
+      <ul>
+         <li>
+            Contention bit: 1 indicating presence of contention
+         
+         <li>
+            Fat Lock ID (20 bits): the ID of the corresponding fat
+            lock
+         
+         <li>
+            Reservation bit: the flag indicating whether the lock is
+            reserved by a thread [<a href="#lock_overhead_ref">7</a>]
+         
+         <li>
+            Rightmost 10 bits unused in TM and reserved for storing
+            the hash codes of Java<a href="#*">*</a> objects
+         
+      </ul>
+      <p>
+         The thread manager has a global lock table to map between
+         the lock ID and the appropriate fat monitor, as follows:
+      </p>
+      <p style="text-align: center">
+         <img src="images/inflated_thin_monitor.gif" alt=
+         "Inflated thin monitor" border="0">
+      </p>
+      <p class="special">
+         Figure 9: Thin and Fat Monitor Relationship
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h3>
+         <a name="AcquireMonitor"></a>5.6.3 Acquiring a Monitor
+      </h3>
+      <p>
+         The process of acquiring a monitor with the help of the
+         <code>hythread_thin_monitor_try_enter()</code> function is
+         shown on the following diagram:
+      </p>
+      <p style="text-align: center">
+         <img src="images/Lock_reservation.gif" alt=
+         "Lock reservation">
+      </p>
+      <p class="special">
+         Figure 10: Acquiring a Thin Lock
+      </p>
+      <p>
+         First, the thread uses the reservation bit to check whether
+         the required lock is owned by this thread. If yes, the
+         thread increases the recursion count by 1 and the function
+         exits. This makes the fast path of the monitor enter
+         operation for a single-threaded application. The fast path
+         involves only a few assembly instructions and does no
+         expensive atomic compare-and-swap (CAS) operations.
+      </p>
+      <p>
+         If the lock is not yet reserved, then it is checked for
+         being occupied. The free lock is set to be reserved and
+         acquired simultaneously with a single CAS operation. If the
+         lock becomes busy then, the system checks whether the lock
+         is fat.
+      </p>
+      <p>
+         The lock table holds a mapping between the fat lock ID and
+         the actual monitor. Fat monitors are extracted from the lock
+         table and acquired. If the lock is not fat and reserved by
+         another thread, then this thread suspends the execution of
+         the lock owner thread, removes the reservation, and resumes
+         the owner thread. After that, the lock acquisition is tried
+         again.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h1>
+         <a name="Usage_Scenarios"></a>6. Usage scenarios
+      </h1>
+      <p>
+         This section contains various scenarios of thread
+         manipulation.
+      </p>
+      <h2>
+         <a name="Thread_lifecycle"></a>6.1 Java<a href="#*">*</a>
+         thread life cycle
+      </h2>
+      <p>
+         The Java<a href="#*">*</a> thread creation procedure
+         consists of the following key stages:
+      </p>
+      <ol>
+         <li>
+            After creating a new thread, the <code>Thread()</code>
+            constructor creates a new native thread and initializes
+            <a href="#Thread_Control_Structure">thread control
+            structures</a> <code>HyThread</code> and
+            <code>JVMTIThread</code>.
+         
+         <li>
+            The user application then calls the
+            <code>java.lang.Thread.start()</code> method of kernel
+            classes within the VM core component.
+         
+         <li>
+            The <code>java.lang.Thread.start()</code> method
+            delegates the call to the <code>jthread_create()</code>
+            function of the Java<a href="#*">*</a> layer in the
+            thread manager via the
+            <code>java.lang.VMThreadManager.start()</code> function.
+         
+         <li>
+            The function <code>jthread_create()</code> calls
+            <code>jthread_create_with_function()</code>.
+         
+         <li>
+            The <code>jthread_create_with_function()</code> function
+            calls <code>hythread_create()</code> supplying
+            <code>wrapper_proc</code> as a new thread body procedure.
+         
+         <li>
+            The <code>hythread_create()</code> function delegates the
+            call to the <code>apr_thread_create()</code> function of
+            the APR porting layer, which does the actual fork and
+            creates a new thread. The <code>wrapper_proc</code>
+            argument is supplied as the thread body at this step.
+         
+         <li>
+            The newly created thread begins to execute
+            <code>thread_start_proc()</code>, which, in its turn,
+            runs the <code>wrapper_proc()</code> function.
+         
+         <li>
+            The function <code>wrapper_proc()</code> performs the
+            required registration of the new thread with other
+            components by sending the <code>vm_attach</code> event to
+            VM core and by calling the
+            <code>jvmti_send_thread_start_end_event()</code>
+            function, which sends the
+            <code>JVMTI_EVENT_THREAD_START</code> event.
+         
+         <li>
+            The function <code>wrapper_proc()</code> calls the
+            <code>java.lang.Thead.run()</code> method, which makes
+            the user-defined body of the new Java<a href="#*">*</a>
+            thread.
+         
+         <li>
+            After <code>Thread.run()</code> has finished, the thread
+            is unregistered with other components by calling the
+            <code>jvmti_send_thread_start_end_event()</code>
+            function, which sends the
+            <code>JVMTI_EVENT_THREAD_END</code> and then the
+            <code>vm_detach</code> events.
+         
+      </ol>
+      <p>
+         The following figure illustrates the detailed sequence of
+         thread creation and completion:
+      </p>
+      <p style="text-align: center">
+         <img alt="Thread operation from creation to finalization"
+         border="0" src="images/ThreadCreation.gif">
+      </p>
+      <p class="special">
+         Figure 11: Java<a href="#*">*</a> Thread Life Cycle
+      </p>
+      <p class="note">
+         <a name="TM.END"></a>Note
+      </p>
+      <p class="notetext">
+         The native thread control structures (such as,
+         <code>HyThread</code> and <code>JVMTIThread</code>) are not
+         de-allocated once the new thread body is finished. The
+         thread manager creates a weak reference for each
+         <code>java.lang.Thread</code> object supplying its internal
+         reference queue. The garbage collector places a reference
+         into that queue when a specific
+         <code>java.lang.Thread</code> object is garbage-collected.
+         Before allocating native resources for new threads, the
+         thread manager seeks for the weak references in the queue.
+         In case the weak references queue is not empty, the thread
+         manager extracts the first available reference and re-uses
+         its native resources for the newly created thread.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h2>
+         <a name="Thread_suspension"></a>6.2 Thread Suspension
+      </h2>
+      <p>
+         One of the important features that the native layer adds for
+         APR threading is <i>safe suspension</i>. This mechanism
+         ensures that the suspended thread can be safely explored by
+         the garbage collector during the enumeration of live
+         references. If a thread holds some system-critical locks,
+         such as the locks associated with the native heap memory,
+         safe suspension can keep it running even during the
+         enumeration. Otherwise, doing the system or
+         &ldquo;hard&rdquo; call to suspend the thread may result in
+         deadlocks in case system locks are requested by other parts
+         of the VM.
+      </p>
+      <p>
+         The algorithm of safe suspension describes the protocol of
+         communication between two threads, for example, thread T1
+         and thread T2, where is T1 safely suspends thread T2. The T1
+         thread calls the <code>hythread_suspend(T2)</code> function
+         to suspend thread T2. The procedure goes in the following
+         stages:
+      </p>
+      <ol>
+         <li>
+            The <code>hythread_suspend(T2)</code> function increments
+            the flag for the T2 thread indicating a request for
+            suspension. Depending on the current state of thread T2,
+            the <code>hythread_suspend(T2)</code> function activates
+            one of the following mechanisms: 
+            <ol>
+               <li>
+                  If thread T2 is currently running in a safe code
+                  region, the <code>hythread_suspend(T2)</code> call
+                  immediately returns, see Figure 12.
+               
+               <li>
+                  If thread T2 is currently in an unsafe region, then
+                  the <code>hythread_suspend()</code> function gets
+                  blocked until thread T2 reaches the beginning of a
+                  safe region or a safe point.
+               
+            </ol>
+         
+         <li>
+            Thread T2 runs to the end of the safe region and gets
+            blocked until T1 resumes it by calling
+            <code>hythread_resume(T2)</code>.
+         
+      </ol>
+      <p>
+         The T2 thread undergoes the following:
+      </p>
+      <ol start="1" type="1">
+         <li>
+            Thread T2 periodically calls the
+            <code>hythread_safe_point()</code> function to designate
+            the points of safe suspension.<br>
+             If a suspension request has been set previously for T2,
+            this method notifies the T1 thread and then waits until
+            T1 resumes it by calling
+            <code>hythread_resume(T2)</code>. 
+         
+         <li>
+            When the T2 thread enters a safe region, it calls the
+            <code>hythread_suspend_ensable()</code> function, which
+            decrements the <code>suspend_disable_count</code> state
+            flag.<br>
+             If a suspension request has been previously set for T2,
+            T1 is notified about T2 having reached a safe region.
+         
+         <li>
+            When T2 leaves a safe region, it calls the
+            <code>hythread_suspend_disable()</code> function. This
+            function increments the
+            <code>suspend_disable_count</code> state flag.
+         
+      </ol>
+      <p>
+         A typical example of the safe suspension scenario takes
+         place when the garbage collector suspends a Java<a href=
+         "#*">*</a> thread to enumerate live references. Figure 12
+         illustrates the case when the GC uses the thread manager to
+         suspend the Java<a href="#*">*</a> thread while it is
+         running in the safe code region.
+      </p>
+      <p style="text-align: center">
+         <img alt="Safe region during thread execution" border="0"
+         src="images/safeRegion.gif">
+      </p>
+      <p class="special">
+         Figure 12: Suspension: Safe Region
+      </p>
+      <p>
+         To understand the safe thread suspension algorithm better,
+         think of each thread as having a lock associated with it.
+         Thread T2 releases the lock when it enters a safe region and
+         acquires the lock when it leaves the safe region. To suspend
+         thread T2, acquire the lock associated with it. Resuming
+         thread T2 is equivalent to releasing the lock associated
+         with it. A straight-forward implementation of the safe
+         suspension algorithm reserves a single-thread optimized lock
+         (that is, the thin monitor) for each thread and uses it for
+         suspending and resuming that thread.
+      </p>
+      <p>
+         Another safe suspension case is when a GC thread hits a
+         Java<a href="#*">*</a> thread while it is in an unsafe
+         region of code, as shown in Figure 13.
+      </p>
+      <p style="text-align: center">
+         <img alt="Safe Point in Thread Execution" border="0" src= 
+         "images/safePoint.gif">
+      </p>
+      <p class="special">
+         Figure 13: Safe Point
+      </p>
+      <p>
+         Consider the <code>hythread_safe_point()</code> operation as
+         a wait operation performed over the monitor associated with
+         the thread. In this case, the <code>hythread_resume()</code>
+         operation is equivalent to notifying that monitor.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h2>
+         <a name="Stop-the-world_Suspension"></a>6.3 Stop-the-world
+         Thread Suspension
+      </h2>
+      <p>
+         The stop-the-world thread suspension happens when the
+         garbage collector needs to enumerate the live object
+         references for all threads of a given thread group. Figure
+         14 illustrates the case when only a GC thread an indefinite
+         number of Java<a href="#*">*</a> threads are running, so
+         that the GC needs to suspend all Java<a href="#*">*</a>
+         threads.
+      </p>
+      <p style="text-align: center">
+         <img alt="stop-the-world suspension" border="0" src= 
+         "images/SuspendAll.gif">
+      </p>
+      <p class="special">
+         Figure 14: Suspending a Group of Threads
+      </p>
+      <p>
+         First, the garbage collector calls the thread manager
+         interface function <code>hythread_suspend_all()</code> to
+         suspend every thread running within the given group (in this
+         scenario, all Java<a href="#*">*</a> threads). The thread
+         manager then returns the iterator for traversing the list of
+         suspended threads. GC uses this iterator to analyze each
+         Java<a href="#*">*</a> thread with respect to live
+         references and then does a garbage collection. After it is
+         complete, GC instructs the thread manager to resume all
+         suspended threads.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h2>
+         <a name="Thread_locking"></a>6.4 Thread Locking
+      </h2>
+      <p>
+         Locking with the thread manager can be done by means of a
+         mutex or a thin monitor. The mutex is preferable in case of
+         high contention, while thin monitors are better optimized
+         for space. This section describes a scenario when the VM
+         core attempts to lock a resource from multiple threads, T1
+         and T2. The major stages of the process of locking and
+         unlocking are shown in Figure 15.
+      </p>
+      <p style="text-align: center">
+         <img alt="locking and unlocking a mutex" border="0" src= 
+         "images/locking.gif">
+      </p>
+      <p class="special">
+         Figure 15: Locking with a Mutex
+      </p>
+      <p>
+         Initially, the mutex is not occupied, that is, the label
+         lock is set to zero. Thread T1 calls the
+         <code>hymutex_lock()</code> function, which instructs the
+         thread manager to mark the mutex as locked by T1.
+      </p>
+      <p>
+         T2 can also call the <code>hymutex_lock()</code> function
+         later, and if it happens to call on a lock already occupied,
+         then T2 is placed into the internal waiting queue associated
+         with the mutex and gets blocked until T1 unlocks the mutex.
+         The T1 thread calls <code>hymutex_unlock()</code> to release
+         the mutex, which enables the mutex to extract T2 from the
+         queue, transfer the lock ownership to this thread, and to
+         notify T2 that it can wake up.
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h2>
+         <a name="Monitor_scenarios"></a>6.5 Monitor enter and exit
+      </h2>
+      <p>
+         Locking Java<a href="#*">*</a> monitors implies interaction
+         between the thread manager and the VM core since the thread
+         manager requires the memory address within the Java<a href= 
+         "#*">*</a> object where it keeps the lock data. The process
+         of locking Java<a href="#*">*</a> monitors is shown on
+         Figure 16 below.
+      </p>
+      <p>
+         When a synchronized section occurs in Java<a href="#*">*</a>
+         code, the following steps are taken:
+      </p>
+      <ol start="1" type="1">
+         <li>
+            The code generated by the JIT compiler calls the
+            <code>hythread_monitor_enter()</code> helper function
+            provided by the thread manager. The helper function
+            provides a chunk of code (stub) that can be in-lined by
+            the JIT compiler directly into the generated assembly
+            code.
+         
+         <li>
+            The <code>hythread_monitor_enter()</code> helper calls
+            the <code>vm_object_get_lockword_addr()</code> function
+            of VM core component to find out the physical address of
+            the lock word within the Java<a href="#*">*</a> object.
+         
+         <li>
+            The helper calls the <code>thin_monitor_try_lock()</code>
+            function in order to acquire the lock associated with the
+            object.
+         
+         <li>
+            In case the lock is acquired, the helper returns. This is
+            the fast path to acquiring the Java<a href="#*">*</a>
+            monitor. In this scenario, the helper does not need to
+            switch between Java<a href="#*">*</a> and native frames
+            and the <code>thin_monitor_try_enter()</code> function is
+            called directly involving no Java<a href="#*">*</a>
+            objects.<br>
+             Otherwise, the helper code enters a slow path by
+            switching between Java<a href="#*">*</a> and native code
+            (see the actions of pushing an M2nFrame and creating the
+            local handle in the figure below).
+         
+         <li>
+            The helper calls the <code>jthread_monitor_enter()</code>
+            function, which works with the Java<a href="#*">*</a>
+            object as with JNI code.
+         
+      </ol>
+      <p style="text-align: center">
+         <img alt="slow and fast paths to locking a Java* monitor"
+         src="images/Monitors.gif">
+      </p>
+      <p class="special">
+         Figure 16: Locking Java<a href="#*">*</a> Monitors
+      </p>
+      <p class="backtotop">
+         <a href="#Top">Back to Top</a>
+      </p>
+      <h1>
+         <a name="References"></a>7. References
+      </h1>
+      <p>
+         This section lists the resources used in this document and
+         other related documents.
+      </p>
+      <p>
+         [<a name="J2SESpec"></a>1] J2SE 1.5.0 specification, <a
+         href="http://java.sun.com/j2se/1.5.0/docs/api/" target= 
+         "_blank">http://java.sun.com/j2se/1.5.0/docs/api/</a>
+      </p>
+      <p>
+         [<a name="JVMTI_ref"></a>2] JVM Tool Interface
+         Specification, <a href= 
+         "http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/jvmti.html"
+         target=
+         "_blank">http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/jvmti.html</a>
+      </p>
+      <p>
+         [<a name="JNI_ref"></a>3] Java<a href="#*">*</a> Native
+         Interface Specification, <a href= 
+         "http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html"
+          target=
+         "_blank">http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html</a>
+      </p>
+      <p>
+         [<a name="APR_ref"></a>4] Apache Portable Runtime project,
+         <a href="http://apr.apache.org/" target=
+         "_blank">http://apr.apache.org/</a>
+      </p>
+      <p>
+         [<a name="posix_ref"></a>5] POSIX standard in threading, <a
+         href= 
+         "http://www.opengroup.org/onlinepubs/009695399/idx/threads.html"
+          target=
+         "_blank">http://www.opengroup.org/onlinepubs/009695399/idx/threads.html</a>
+      </p>
+      <p>
+         [<a name="thin_lock_ref"></a>6] David F. Bacon, Ravi Konuru,
+         Chet Murthy, Mauricio Serrano, <em>Thin locks: featherweight
+         synchronization for Java</em>, <a href= 
+         "http://portal.acm.org/citation.cfm?id=277734" target=
+         "_blank">http://portal.acm.org/citation.cfm?id=277734</a>
+      </p>
+      <p>
+         [<a name="lock_overhead_ref"></a>7] Kiyokuni Kawachiya Akira
+         Koseki Tamiya Onodera, <em>Lock Reservation: Java Locks Can
+         Mostly Do Without Atomic Operation</em>, <a href= 
+         "http://portal.acm.org/citation.cfm?id=582433" target=
+         "_blank">http://portal.acm.org/citation.cfm?id=582433</a>
+      </p>
+      <p>
+         [<a name="hythread_ref"></a>8] HyThread documentation, <a
+         href= 
+         "http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/doc/vm_doc/html/group__Thread.html"
+          target=
+         "_blank">http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/doc/vm_doc/html/group__Thread.html</a>
+      </p>
+      <p>
+          
+      </p>
+      <p>
+          
+      </p>
+      <p class="backtotop">
+         <a href="#top">Back to Top</a>
+      </p>
+      <p>
+         (C) Copyright 2006 Intel Corporation. All rights reserved.
+      </p>
+      <p>
+         <a name="*"></a>* Other brands and names are the property of
+         their respective owners.
+      </p>
+   </body>
+</html>
+

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/conventions.htm
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/conventions.htm?rev=434076&view=auto
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/conventions.htm (added)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/conventions.htm Wed Aug 23 09:48:41 2006
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "hcodep://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<title>Documentation Conventions</title>
+<link rel=Stylesheet type="text/css" media=all href=drl.css>
+
+
+<body>
+<p class="title"><a name="Notation_Conventions"></a>Documentation Conventions</p>
+<P> The DRL (Dynamic Runtime Layer) documentation set uses the following conventions: </P>
+<table border=1 width="100%">
+ <tr>
+ <td class="TableHeading">Convention </td>
+ <td class="TableHeading"> Explanation&nbsp;</td>
+ <td class="TableHeading">Example</td>
+ </tr>
+ <tr>
+ <td rowspan="5"><code>monospace</code> </td>
+ <td class="TableCell"> Filenames</td>
+ <td><code> ippsapi.h</code></td></tr>
+ <tr>
+ <td class="TableCell"> Directory names and pathnames </td>
+ <td><code> \alt\include</code></td>
+ </tr>
+ <tr>
+ <td class="TableCell"> Commands and command-line options</td> <td><code> ecl 
+	-O2</code></td>
+ </tr>
+ <tr>
+ <td class="TableCell"> Function names, methods, classes, data structures in 
+	running text </td>
+ <td class="TableCell">Use the <code> okCreateObjs </code> function to ...</td>
+ </tr>
+ <tr>
+ <td class="TableCell"> Parameters or other placeholders &nbsp;</td>
+    <td><code>ippiMalloc(int widthPixels, ...)<br>
+      int* pStepBytes</code></td>
+ </tr>
+ <tr>
+ <td class="TableCell"><code><b> monospace bold&nbsp; </b></code></td>
+ <td class="TableCell"> User input </td>
+ <td class="TableCell"><code> [c:] <b> dir</b></code></td>
+ </tr>
+ <tr>
+ <td class="TableCell"><i>italics </i></td>
+ <td class="TableCell"> Emphasis; introducing or defining terms</td>
+ <td class="TableCell"> The term <i> access</i> takes as its subject ... </td>
+ </tr>
+ <tr>
+ <td class="TableCell"> [ ]</td>
+ <td class="TableCell"> Optional items</td>
+ <td class="TableCell"><code> -Fa[c]</code> Indicates these command-line 
+	options: <code> -Fa</code> and <code> -Fac</code></td>
+ </tr>
+ <tr>
+ <td class="TableCell"> { | }  </td>
+ <td class="TableCell"> Choice of one item from a selection of two or more 
+	items</td>
+ <td class="TableCell"><code> -aX{K | W | P}</code> Indicates these command-line 
+	options: <code><br> -aXK <br> -aXW <br> -aXP</code></tr></table>
+</body>
+
+</html>

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/drl.css
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/drl.css?rev=434076&view=auto
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/drl.css (added)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/drl.css Wed Aug 23 09:48:41 2006
@@ -0,0 +1,271 @@
+P {
+	margin-left: 15pt;
+	margin-top: 5pt;
+	margin-right: 0.00in;
+	margin-bottom: 5pt;
+	font-size: 10.0pt;
+	font-family: "Arial MT", Arial;
+}
+
+.title {
+	font-weight: bold;
+	font-size: 18pt;
+	text-align: center;
+	color: #525D76; 
+	line-height: 1.25;
+	font-family: Helvetica, Arial, Tahoma, Verdana, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+}
+
+
+h1 {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 16pt;
+	color: white;
+	background-color: #525D76;
+	font-weight: normal;
+	text-transform: uppercase;
+	padding-left: 4px;
+}
+
+h2 {
+	font-size: 10pt;
+	font-family: Arial, Helvetica, sans-serif;
+	color: white;
+	background-color: #828DA6;
+	margin-left: 15pt;
+	margin-top: 5pt;
+	margin-right: 0in;
+	margin-bottom: 5pt;
+	text-transform: uppercase;
+	padding-left: 4px;
+	font-weight: normal;
+	letter-spacing: 4px;
+	word-spacing: 7px;
+}
+
+h3 {
+	font-weight: bold;
+	margin-left: 15pt;
+	margin-top: 5pt;
+	margin-right: 0pt;
+	margin-bottom: 5pt;
+	font-size: 11pt;
+	font-family: Arial;
+	text-transform: uppercase;
+}
+
+pre {
+	margin: 0in;
+	margin: 5pt;
+	background: #F3F5F7;
+	border: thin solid;
+	border-color: #828DA6;
+	padding: 12pt;
+	font-size: 11.0pt;
+	font-family: Courier;
+}
+
+.code {
+	font-weight: normal;
+	font-size: 12pt;
+	text-align: left;
+	text-indent: 0.00in;
+	color: #000000;
+	line-height: 1.25;
+	margin-left: 0.025in;
+	margin-right: 0.00in;
+	margin-top: 10pt;
+	margin-bottom: 10pt;
+	font-family: "Andale Mono", "Courier New", Courier "misc fixed", "sony fixed", monospaced;
+}
+
+.special {
+	font-weight: bold;
+	font-size: 10pt;
+	text-align: center;
+	color: #525D76; 
+	line-height: 1.25;
+	margin-left: 0.70in;
+	margin-right: 1.00in;
+	margin-top: 3pt;
+	margin-bottom: 3pt;
+	font-family: Helvetica, Arial, Tahoma, Verdana, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+}
+
+.backtotop {
+	font-weight: bold;
+	font-size: 10pt;
+	text-align: left;
+	line-height: 1.25;
+	margin-left: 0pt;
+	margin-right: 0pt;
+	margin-top: 3pt;
+	margin-bottom: 0pt;
+	font-family: Helvetica, Arial, Tahoma, Verdana, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+}
+.note {
+	color: red;
+	font-weight: bolder;
+	font-size: 10pt;
+	text-align: left;
+	line-height: normal;
+	margin-left: 0.70in;
+	margin-right: 1.00in;
+	margin-top: 3pt;
+	margin-bottom: 3pt;
+	font-family: Verdana, Helvetica, Arial, Tahoma, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+	
+}
+.notetext {
+	font-size: 10pt;
+	font-weight: normal;
+	text-align: left;
+	line-height: normal;
+	margin-left: 0.70in;
+	margin-right: 1.00in;
+	margin-top: 0pt;
+	margin-bottom: 6pt;
+	font-family: Verdana, Helvetica, Arial, "Arial MT", Tahoma, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+	color: Black;
+}
+
+
+a:link {
+	color: #0044B3;
+	border: none #000000 1.0pt;
+	padding: 0in;
+	x-text-underline: normal;
+	text-underline: single;
+	x-text-underline: normal;
+	text-decoration: underline underline; 
+}
+
+a:visited {
+	color: #800080;
+	x-text-underline: normal;
+	text-underline: single;
+	x-text-underline: normal;
+	text-decoration: underline underline; 
+}
+
+.TOCHeading {
+	font-weight: bold;
+	font-size: 12pt;
+	text-align: left;
+	color: #000000;
+	font-family: Helvetica, Arial, Tahoma, Verdana, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+   padding-left: 15px;
+	margin-bottom: 5pt;
+	margin-top: 5pt;
+	margin-left: 5px;
+	margin-right: 0pt;
+}
+
+.TOC {
+   font-size: 11pt;
+	text-align: left;
+	text-indent: 0.25in;
+	color: #000000;
+	padding-left: 15px;
+	margin-left: 5px;
+	margin-right: 0.00px;
+	margin-top: 0px;
+	margin-bottom: 0px;
+	font-family: Helvetica, Arial, Tahoma, Verdana, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+}
+
+table {
+		margin-left: 15pt;
+}
+
+.TableHeading {
+	font-weight: bold;
+	font-size: 11pt;
+	color: white; 
+	text-align: center;
+	background-color: #828DA6;
+	font-family: Helvetica, Arial, Tahoma, Verdana, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+	padding: 6px;	
+	border: none;
+}
+
+.TableCell {
+	font-weight: normal;
+	font-size: 10pt;
+	text-align: left;
+	text-indent: 0.00in;
+	padding: 2pt;
+	margin-top: 4pt;
+	margin-bottom: 4pt;
+	font-family: Helvetica, Arial, Tahoma, Verdana, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+	padding: 6px;
+	border: solid #828DA6 0.5pt;
+}
+
+.update {
+	color: #A9A9A9;
+	font-size: smaller;
+	font-style: italic;
+}
+
+li {
+	margin: 3pt 3pt;
+	font-size: 10.0pt;
+	font-family: Arial, "Arial MT";
+}
+
+DD {
+	font-weight:  normal;
+	margin-left: 65pt;
+	margin-top: 5pt;
+	margin-right: 20pt;
+	margin-bottom: 5pt;
+	font-size: 10pt;
+	font-family: "Arial MT", Arial;
+	border-right: none;
+	border-bottom: none;
+	border-left: none;
+	border-top: solid #828DA6 1px;
+	padding-bottom: 8px;
+}
+
+DT {
+	font-size: 10pt;
+	font-family: Helvetica, Arial, Tahoma, Verdana, "Nimbus Sans L", lucida-sans, lucidasans, sanserif;
+	font-weight: bolder;
+	margin-left: 20pt;
+	margin-top: 5pt;
+	margin-right: 0pt;
+	margin-bottom: 5pt;
+	border-top: none;
+	border-right: none;
+	border-bottom: none;
+	border-left: none;	
+}
+
+DL {
+	margin-left: 0pt;
+	margin-top: 0pt;
+	margin-right: 0pt;
+	margin-bottom: 0pt;
+}
+
+.class {
+	font-weight: bold; 
+	margin-left: 15pt;
+	margin-top: 5pt;
+	margin-right: 0pt;
+	margin-bottom: 5pt;
+	font-size: 11pt;
+	font-family: Arial;
+	border-bottom-width: 2px;
+	border-top: none;
+	border-right: none;
+	border-bottom: solid #525D76 2px;
+	border-left: none;
+}
+
+blockquote {
+	margin-top: 5px;
+	margin-bottom:5px;
+}

Propchange: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/drl.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/JavaAttached.gif
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/JavaAttached.gif?rev=434076&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/JavaAttached.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/Lock_reservation.gif
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/Lock_reservation.gif?rev=434076&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/Lock_reservation.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/Monitors.gif
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/Monitors.gif?rev=434076&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/Monitors.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/NativeUnattachedThread.gif
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/NativeUnattachedThread.gif?rev=434076&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/NativeUnattachedThread.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/SuspendAll.gif
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/SuspendAll.gif?rev=434076&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/SuspendAll.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/Synchronizer_mutex.gif
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/Synchronizer_mutex.gif?rev=434076&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/Synchronizer_mutex.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/ThreadCreation.gif
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/ThreadCreation.gif?rev=434076&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/ThreadCreation.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/ThreadingSystem.gif
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/ThreadingSystem.gif?rev=434076&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/ThreadingSystem.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/inflated_lockword.gif
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/thread/doc/images/inflated_lockword.gif?rev=434076&view=auto
==============================================================================
Binary file - no diff available.