You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by wj...@apache.org on 2007/08/17 19:46:03 UTC

svn commit: r567096 - in /harmony/enhanced/drlvm/trunk: build/make/targets/ vm/gcv4/src/ vm/include/open/ vm/tests/unit/framework/ vm/tests/unit/thread/ vm/tests/unit/thread/utils/ vm/thread/src/ vm/thread/src/linux/ vm/vmcore/src/init/ vm/vmcore/src/j...

Author: wjwashburn
Date: Fri Aug 17 10:46:01 2007
New Revision: 567096

URL: http://svn.apache.org/viewvc?view=rev&rev=567096
Log:
Harmony-4608:  This is the first patch of the Thread Lifecycle
redesign document.


Removed:
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_performance.h
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_performance_basic.c
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_performance_concurrent_mutex.c
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_private.h
Modified:
    harmony/enhanced/drlvm/trunk/build/make/targets/common_vm.xml
    harmony/enhanced/drlvm/trunk/build/make/targets/cunit.test.xml
    harmony/enhanced/drlvm/trunk/build/make/targets/test.xml
    harmony/enhanced/drlvm/trunk/vm/gcv4/src/gc_threads.cpp
    harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h
    harmony/enhanced/drlvm/trunk/vm/tests/unit/framework/testframe.h
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c
    harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h
    harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def
    harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp
    harmony/enhanced/drlvm/trunk/vm/thread/src/linux/os_thread.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_fat_monitor.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_interrupt.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_iterator.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c
    harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_basic.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp

Modified: harmony/enhanced/drlvm/trunk/build/make/targets/common_vm.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/targets/common_vm.xml?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/build/make/targets/common_vm.xml (original)
+++ harmony/enhanced/drlvm/trunk/build/make/targets/common_vm.xml Fri Aug 17 10:46:01 2007
@@ -234,18 +234,5 @@
                 <linkerarg value="-lgcc_s" />
             </select>
         </linker>
-
-        <fileset id="unit.test.c.framework.src"
-                 dir="${build.VM.home}/tests/unit/framework">
-            <include name="*.c" />
-        </fileset>
-
-        <path id="unit.test.common.c.include">
-            <pathelement location="${build.VM.home}/tests/unit/framework" />
-            <pathelement location="${build.VM.home}/include" />
-            <pathelement location="${build.VM.home}/include/open" />
-            <pathelement location="${build.VM.home}/vmcore/src/thread" />
-            <pathelement location="${build.VM.home}/port/include" />
-        </path>
     </target>
 </project>

Modified: harmony/enhanced/drlvm/trunk/build/make/targets/cunit.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/targets/cunit.test.xml?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/build/make/targets/cunit.test.xml (original)
+++ harmony/enhanced/drlvm/trunk/build/make/targets/cunit.test.xml Fri Aug 17 10:46:01 2007
@@ -16,174 +16,215 @@
 -->
 <project name="C UNIT TESTS">
     <target name="cunit.test" depends="init_component">
+
+        <!-- Set cunit tests include dirs -->
         <path id="unit.test.c.include">
             <pathelement location="${build.VM.home}/tests/unit/thread/utils" />
+            <pathelement location="${build.VM.home}/tests/unit/framework" />
             <pathelement location="${build.semi.dir}/extra/apr/include" />
             <pathelement location="${build.semi.dir}/extra/apr/include/apr-1" />
+            <pathelement location="${build.VM.home}/include" />
             <pathelement location="${build.VM.home}/vmcore/include" />
+            <pathelement location="${build.VM.home}/port/include" />
         </path>
+
+        <!-- Set cunit tests sources -->
         <fileset id="unit.test.c.src" dir="${build.VM.home}/tests/unit/thread">
             <include name="*.c" />
-            <exclude name="*performance*"/>
         </fileset>
-        <!-- compiler to compile framework as well as the unit tests -->
-        <compiler name="${build.cxx}" id="unit.test.c.compiler">
-            <defineset define="APR_DECLARE_STATIC, _DEBUG, VM_STATS" />
-            <defineset define="BUILDING_VM" />
-            <select os="win">
-                <defineset define="PLATFORM_NT, WIN32, _WINDOWS" />
-                <defineset define="_WIN32_WINNT=0x0501" />
+
+        <!-- Create cunit tests work dir -->
+        <property name="unit.test.c.workdir" value="${build.dir}/_cunit.tests" />
+        <mkdir dir="${unit.test.c.workdir}/_obj" />
+        <mkdir dir="${unit.test.c.workdir}/_bin" />
+        <mkdir dir="${unit.test.c.workdir}/report" />
+
+        <compiler name="${build.cxx}" id="cunit.test.compiler">
+            <defineset define="APR_DECLARE_STATIC, BUILDING_VM"/>
+            <select cfg="release">
+                <defineset define="NDEBUG" />
+                <select os="win">
+                    <select cxx="icl">
+                        <compilerarg value="/QxN" />
+                        <compilerarg value="/O3" />
+                        <compilerarg value="/Qip" />
+                    </select>
+                    <select cxx="msvc">
+                        <compilerarg value="/Ox" />
+
+                    </select>
+                </select>
+                <select osfamily="unix">
+                    <compilerarg value="-O2" />
+                </select>
             </select>
-            <select os="lnx">
-                <defineset define="LINUX, GC_V4" />
-                <defineset define="USE_DLL_JIT, PLATFORM_POSIX" />
-                <defineset define="__SMP__, _REENTRANT" />
-                <defineset define="LINUX_TLS_OPT, _IA32_" />
-                <defineset define="_LARGEFILE64_SOURCE" />
-                <compilerarg value="-Wall" />
-                <compilerarg value="-fno-exceptions" />
-                <compilerarg value="-g" />
-                <compilerarg value="-O0" />
+ 
+            <select cfg="debug">
+                <defineset define="_DEBUG,VM_STATS" />
+                <select osfamily="unix">
+                    <compilerarg value="-O0" />
+                    <compilerarg value="-g" />
+                    <compilerarg value="-ggdb3" />
+                </select>
+                <select os="win" cxx="icl">
+                    <compilerarg value="/QxN" />
+                    <compilerarg value="/Qip" />
+                    <compilerarg value="/O3" />
+                </select>
             </select>
+
             <select arch="ia32">
                 <defineset define="_IA32_" />
             </select>
+            <select arch="ipf">
+                <defineset define="_IPF_,POINTER64,HYIA64" />
+            </select>
             <select arch="em64t">
-                <defineset define="_EM64T_" />
-                <defineset define="POINTER64" />
-                <defineset define="LAZY_LOCK" />
+                <defineset define="_EM64T_,POINTER64,LAZY_LOCK,HYX86_64" />
+            </select>
+            <select arch="ppc32">
+                <defineset define="_PPC32_,_PPC_,HYPPC32" />
+            </select>
+            <select os="win">
+                <defineset define="PLATFORM_NT,WIN32,_WINDOWS" />
+                <defineset>
+                    <define name="_WIN32_WINNT" value="0x0501" />
+                </defineset>
+                <compilerarg value="/nologo" />
+                <compilerarg value="/W3" />
+                <select arch="ia32,ipf">
+                    <compilerarg value="/WX" />
+                </select>
+                <compilerarg value="/Zi" />
+            </select>
+            <select osfamily="unix">
+                <defineset define="PLATFORM_POSIX" />
+                <compilerarg value="-fno-exceptions" />
+                <select os="macosx">
+                    <defineset define="MACOSX" />
+                </select>
+                <select os="lnx">
+                    <defineset define="LINUX" />
+                </select>
+                <defineset define="__SMP__,_REENTRANT,LINUX_TLS_OPT" />
+                <select arch="em64t">
+                    <compilerarg value="-ftls-model=initial-exec" /> 
+                </select>
+                <select arch="ia32">
+                    <defineset define="_LARGEFILE64_SOURCE" />
+                </select>
+                <select os="lnx" arch="em64t,ipf">
+                    <compilerarg value="-fPIC" />
+                </select>
+                <select cxx="icc">
+                    <compilerarg value="-w1" />
+                </select>
+            </select>
+            <select cxx="icc,icl">                  
+                <compilerarg value="-mp" />
             </select>
         </compiler>
-        <!-- Compiling framework -->
-        <echo message="## Compiling framework..." />
-        <!-- a new property: cunit tests work dir -->
-        <property name="unit.test.c.workdir"
-                          value="${build.dir}/_cunit.tests" />
-        <mkdir dir="${unit.test.c.workdir}/_obj" />
-        <cc objdir="${unit.test.c.workdir}/_obj"
-                    debug="true"
-                    runtime="static"
-                    multithreaded="true">
-            <compiler refid="unit.test.c.compiler" />
-            <fileset refid="unit.test.c.framework.src" />
+       
+        <!-- Compiling cunit tests and framework -->
+        <echo message="cunit: Compiling tests and framework..." />
+        <cc objdir="${unit.test.c.workdir}/_obj" multithreaded="true">
+            <compiler refid="cunit.test.compiler" />
             <fileset dir="${build.VM.home}/tests/unit/thread/utils">
                 <include name="*.c" />
             </fileset>
-            <includepath refid="unit.test.common.c.include" />
+            <fileset dir="${build.VM.home}/tests/unit/framework">
+                <include name="*.c" />
+            </fileset>
+            <fileset refid="unit.test.c.src"/>
             <includepath refid="unit.test.c.include" />
         </cc>
-        <!-- a list of all source files with unit tests -->
-        <pathconvert pathsep=","
-                             property="unit.test.c.files"
-                             refid="unit.test.c.src" />
-        <!-- operation system sensitive executive binary file extention.
-                     simply said: "" or ".exe" ;) -->
+        
+        <!-- Create a list of cunit tests excecutable -->
+        <pathconvert pathsep="," property="unit.test.c.files" refid="unit.test.c.src" />
+        <propertyregex override="yes" property="unit.test.c.files" input="${unit.test.c.files}"
+            regexp="\.c" replace="" defaultValue="${unit.test.c.files}" />
         <condition property="extention" value=".exe">
             <isset property="if.win" />
         </condition>
         <property name="extention" value="" />
-        <!-- replacing: 'xxx.c, yyy.c' => 'xxx yyy' -->
-        <propertyregex override="yes"
-                               property="unit.test.c.files"
-                               input="${unit.test.c.files}"
-                               regexp="\.c"
-                               replace=""
-                               defaultValue="${unit.test.c.files}" />
-        <!-- Compiling unit tests -->
-        <echo message="## Compiling C unit tests" />
-        <cc objdir="${unit.test.c.workdir}/_obj"
-                    debug="true"
-                    runtime="static"
-                    multithreaded="true" 
-                    subsystem="console">
-            <compiler refid="unit.test.c.compiler" />
-            <fileset refid="unit.test.c.src" />
-            <includepath refid="unit.test.common.c.include" />
-            <includepath refid="unit.test.c.include" />
-        </cc>
-        <mkdir dir="${unit.test.c.workdir}/_bin" />
 
-        <mkdir dir="${unit.test.c.workdir}/report" />
-        <!-- set of properties which will be needed for test execution -->
+        <!-- Compiling cunit tests -->
         <property name="filename" value="--" />
-        <property name="outputproperty" value="--" />
-        <property name="resultproperty" value="--" />
+
+        <echo message="cunit: Compiling tests..." />
         <for list="${unit.test.c.files}" param="file" delimiter=",">
             <sequential>
-                <!-- make it possible to overwrite the property -->
+
                 <var name="filename" unset="true" />
                 <basename property="filename" file="@{file}" />
-                <!-- Linking unit test -->
-                <echo message="## Linking C unit test: ${filename}" />
-                <cc name="${build.cxx}"
-                            debug="true"
-                            outfile="${unit.test.c.workdir}/_bin/${filename}"
-                            outtype="executable" 
-                            subsystem="console">
+
+                <echo message="cunit: Compile test: ${filename}" />
+                
+                <cc outfile="${unit.test.c.workdir}/_bin/${filename}${extention}"
+                    runtime="dynamic" multithreaded="true" subsystem="console">
+                    
+                    <compiler refid="cunit.test.compiler" />
+                    
                     <linker name="${build.cxx}">
                         <fileset dir="${unit.test.c.workdir}/_obj">
-                            <include name="${filename}.o*" />
                             <include name="thread_unit_test_main.o*" />
                             <include name="thread_unit_test_utils.o*" />
                             <include name="testframe.o*" />
+                            <include name="${filename}.o*" />
                         </fileset>
 
-                        <libset libs="hythr" dir="${build.semi.dir}/vm/hythr/_bin" />
-                        <libset libs="encoder" dir="${build.semi.dir}/vm/encoder/_bin" />
-                        <libset libs="aprutil-1" dir="${build.semi.dir}/extra/aprutil/_bin" />
-                        <libset libs="port" dir="${build.semi.dir}/vm/port/_bin" />
-                        <libset libs="log4cxx" dir="${build.semi.dir}/extra/log4cxx/_bin" />
-                        <libset libs="hyzlib" dir="${external.dep.CLASSLIB}/deploy/jdk/jre/bin" />
-                        <libset libs="harmonyvm" dir="${build.semi.dir}/vm/vmcore/_bin" />
-                        <libset libs="icuuc" dir="${external.dep.CLASSLIB.libdir}" />
                         <select os="win">
-                            <syslibset libs="advapi32, ws2_32, mswsock, user32, userenv, odbc32" />
-                            <linkerarg value="/NODEFAULTLIB:libcmt.lib" />
+                            <libset type="shared" libs="harmonyvm"
+                                dir="${build.semi.dir}/vm/vmcore/_bin" />
+                            <libset type="shared" libs="hythr"
+                                dir="${build.semi.dir}/vm/hythr/_bin" />
+                            <linkerarg value="/libpath:${build.deploy.dir}/jdk/jre/bin/default" />
+                            <linkerarg value="/NODEFAULTLIB:libcmtd" />
                         </select>
+                        
                         <select os="lnx">
-                            <syslibset type="shared" libs="stdc++, gcc_s, pthread, rt" />
-                            <select arch="ia32">
-                                <libset type="shared" libs="icuuc" />
-                                <libset type="shared" libs="icudata"
-                                    dir="${external.dep.CLASSLIB}/depends/libs/linux.x86" />
-                                </select>               
-                            <select arch="em64t">
-                                <libset type="shared" libs="icuuc"
-                                    dir="${external.dep.CLASSLIB}/depends/libs/linux.x86_64" />
-                                <libset type="shared" libs="icudata"
-                                    dir="${external.dep.CLASSLIB}/depends/libs/linux.x86_64" />
-                            </select>
-                            <select arch="ipf">
-                                <libset type="shared" libs="icuuc"
-                                    dir="${external.dep.CLASSLIB}/depends/libs/linux.ia64" />
-                                <libset type="shared" libs="icudata"
-                                    dir="${external.dep.CLASSLIB}/depends/libs/linux.ia64" />
-                            </select>
+                            <libset type="shared" libs="harmonyvm"
+                                dir="${build.deploy.dir}/jdk/jre/bin/default" />
+                            <linkerarg value="-rpath" />
+                            <linkerarg value="${build.deploy.dir}/jdk/jre/bin" />
+                            <linkerarg value="-rpath" />
+                            <linkerarg value="${build.deploy.dir}/jdk/jre/bin/default" />
                         </select>
                     </linker>
                 </cc>
             </sequential>
         </for>
-        
+                    
+        <!-- Executing cunit tests... -->
+        <property name="outputproperty" value="--" />
+        <property name="resultproperty" value="--" />
         <delete file="${build.semi.dir}/cunit.test.failed" failonerror="false" />
-            
+
+        <echo message="cunit: Compiling tests..." />
         <for list="${unit.test.c.files}" param="file" delimiter=",">
             <sequential>
-                <!-- make it possible to overwrite the property -->
+                
                 <var name="filename" unset="true" />
                 <basename property="filename" file="@{file}" />
-                <!-- Executing unit test -->
-                <echo message="## Executing C unit test: ${filename}" />
+                
+                <!-- Executing unit test... -->
+                <echo message="cunit: Executing test: ${filename} ..." />
                 <var name="outputproperty" unset="true" />
                 <var name="resultproperty" unset="true" />
                 <exec dir="${unit.test.c.workdir}/_bin"
-                              executable="${unit.test.c.workdir}/_bin/${filename}${extention}"
-                              resultproperty="resultproperty"
-                              outputproperty="outputproperty">
+                    executable="${unit.test.c.workdir}/_bin/${filename}${extention}"
+                    resultproperty="resultproperty"
+                    outputproperty="outputproperty">
+                    
                     <arg value="-Dorg.apache.harmony.vm.vmdir=${build.deploy.dir}/jdk/jre/bin/default"/>
                     <arg value="-Djava.home=${build.deploy.dir}/jdk/jre ${test.vmargs}"/>
                     <arg value="-XX:vm.jvmti.enabled=true"/>
+                    <select arch="ipf">
+                        <arg value="-Xint"/>
+                    </select>
+                    
                     <env key="JAVA_HOME" value="${build.deploy.dir}/jdk/jre" />
+                    
                     <select os="win">
                         <env key="Path" path="${build.deploy.dir}/jdk/jre/bin/:${build.deploy.dir}/jdk/jre/bin/default:${env.Path}" />
                     </select>
@@ -191,38 +232,47 @@
                         <env key="LD_LIBRARY_PATH" path="${build.deploy.dir}/jdk/jre/bin/:${build.deploy.dir}/jdk/jre/bin/default" />
                     </select>
                 </exec>
-                <echo file="${unit.test.c.workdir}/report/${filename}.out"
-                              message="${outputproperty}" />
-                <echo message="${outputproperty}" />
+
+                <!-- Echo test output... -->
+                <echo file="${unit.test.c.workdir}/report/${filename}.out" message="${outputproperty}" />
+                <!-- echo message="${outputproperty}" / -->
+
+                <!-- Checking test result... -->
                 <if>
                     <not>
                         <equals arg1="${resultproperty}" arg2="0" />
                     </not>
                     <then>
+                        
+                        <!-- Test failed... -->
                         <property name="test.failed" value="true" />
-                        <echo message="## TEST FAILED" />
+                        <echo message="cunit: TEST FAILED" />
                         <echo file="${build.semi.dir}/cunit.test.failed" message="${filename} FAILED${line.separator}" append="true"/>
 
-<echo file="${unit.test.c.workdir}/report/TEST-${filename}.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" failures="1" name="@@@@@" tests="1" time="0.01">
-<testcase classname="@@@@@" name="test" time="0.1"><error message="FAILED"/></testcase>
-<system-out><![CDATA[@out]!]></system-out>
-</testsuite>]]> 
-</echo>
+                        <echo file="${unit.test.c.workdir}/report/TEST-${filename}.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8" ?>
+                            <testsuite errors="0" failures="1" name="@@@@@" tests="1" time="0.01">
+                                <testcase classname="@@@@@" name="test" time="0.1"><error message="FAILED"/></testcase>
+                                <system-out><![CDATA[@out]!]></system-out>
+                            </testsuite>]]>
+                        </echo>
 
                     </then>
                     <else>
-                        <echo message="## TEST PASSED" />
-<echo file="${unit.test.c.workdir}/report/TEST-${filename}.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8" ?>
-<testsuite errors="0" failures="0" name="@@@@@" tests="1" time="0.01">
-<testcase classname="@@@@@" name="test" time="0.1"></testcase>
-<system-out><![CDATA[@out]!]></system-out>
-</testsuite>]]> 
-</echo>
+                        
+                        <!-- Test passed... -->
+                        <echo message="cunit: TEST PASSED" />
+                        <echo file="${unit.test.c.workdir}/report/TEST-${filename}.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8" ?>
+                            <testsuite errors="0" failures="0" name="@@@@@" tests="1" time="0.01">
+                                <testcase classname="@@@@@" name="test" time="0.1"></testcase>
+                                <system-out><![CDATA[@out]!]></system-out>
+                            </testsuite>]]>
+                        </echo>
+                        
                     </else>
                 </if>
-                <replace file="${unit.test.c.workdir}/report/TEST-${filename}.xml" token="@@@@@" value="${filename}" /> 
-                <!-- grab System.out to xml-file -->
+
+                <!-- Setting file output to xml... -->
+                <replace file="${unit.test.c.workdir}/report/TEST-${filename}.xml" token="@@@@@" value="${filename}" />
                 <if>
                     <isset property="outputproperty" />
                     <then>
@@ -235,6 +285,7 @@
             </sequential>
         </for>
 
+        <!-- Creating execution report... -->
         <property name="cunit.tests.report.dir" location="${unit.test.c.workdir}/report/html"/>
         <delete dir="${cunit.tests.report.dir}" />
         <mkdir dir="${cunit.tests.report.dir}" />
@@ -246,6 +297,7 @@
         </junitreport>
 
         <echo message="## Please find tests and results at ${build.dir}/_cunit.tests/" />
-        <fail unless="run.all.tests" if="test.failed" message="## SOME TESTS FAILED"/>
+        <fail unless="run.all.tests" if="test.failed" message="cunit: SOME TESTS FAILED"/>
     </target>
 </project>
+

Modified: harmony/enhanced/drlvm/trunk/build/make/targets/test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/targets/test.xml?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/build/make/targets/test.xml (original)
+++ harmony/enhanced/drlvm/trunk/build/make/targets/test.xml Fri Aug 17 10:46:01 2007
@@ -17,7 +17,7 @@
 <project name="ALL TESTS">
     <select arch="ipf">
         <propertyregex property="test.mode" input="${test.mode}" regexp="(jet|opt|srv)" replace="" override="on" />
-        <target name="test" depends="smoke.test, kernel.test, check-result"/>
+        <target name="test" depends="cunit.test, smoke.test, kernel.test, check-result"/>
     </select>
     <select arch="ia32,em64t">
         <target name="test" depends="jvmti.test, cunit.test, smoke.test, kernel.test, check-result"/>

Modified: harmony/enhanced/drlvm/trunk/vm/gcv4/src/gc_threads.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gcv4/src/gc_threads.cpp?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/gcv4/src/gc_threads.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/gcv4/src/gc_threads.cpp Fri Aug 17 10:46:01 2007
@@ -123,7 +123,7 @@
     stat = hysem_create(&_gc_thread_work_done_event, 0, 1); 
     assert(stat == TM_ERROR_NONE);
     _thread_handle=NULL;
-    stat = hythread_create_with_group(&_thread_handle, get_thread_group(), 0, 0, 0, gc_thread_func, this);
+    stat = hythread_create(&_thread_handle, 0, 0, 0, gc_thread_func, this);
     if (stat != TM_ERROR_NONE) { 
         DIE("GC_Thread::GC_Thread(..): CreateThread() failed...exiting...");
     }

Modified: harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/hythread_ext.h Fri Aug 17 10:46:01 2007
@@ -189,9 +189,8 @@
  */
 //@{
 
-IDATA VMCALL hythread_attach_ex(hythread_t *handle, hythread_library_t lib);
-IDATA VMCALL hythread_attach_to_group(hythread_t *handle, hythread_library_t lib, hythread_group_t group);
-IDATA hythread_create_with_group(hythread_t *ret_thread, hythread_group_t group, UDATA stacksize, UDATA priority, UDATA suspend, hythread_entrypoint_t func, void *data);
+IDATA VMCALL hythread_create_with_group(hythread_t new_thread, hythread_group_t group, UDATA stacksize, UDATA priority, hythread_entrypoint_t func, void *data);
+IDATA VMCALL hythread_attach_to_group(hythread_t new_handle, hythread_library_t lib, hythread_group_t group);
 UDATA VMCALL hythread_clear_interrupted_other(hythread_t thread);
 IDATA VMCALL hythread_join(hythread_t t);
 IDATA VMCALL hythread_join_timed(hythread_t t, I_64 millis, IDATA nanos);
@@ -199,7 +198,7 @@
 IDATA VMCALL hythread_get_self_id();
 IDATA VMCALL hythread_get_id(hythread_t t);
 hythread_t VMCALL hythread_get_thread(IDATA id);
-IDATA VMCALL hythread_struct_init(hythread_t *ret_thread);
+IDATA VMCALL hythread_struct_init(hythread_t new_thread);
 IDATA VMCALL hythread_cancel_all(hythread_group_t group);
 IDATA hythread_group_create(hythread_group_t *group);
 IDATA VMCALL hythread_group_release(hythread_group_t group);
@@ -211,6 +210,7 @@
 UDATA hythread_get_thread_stacksize(hythread_t thread);
 UDATA VMCALL hythread_uses_fast_tls(void);
 IDATA VMCALL hythread_get_hythread_offset_in_tls(void);
+IDATA VMCALL hythread_get_struct_size();
 
 IDATA VMCALL hythread_thread_lock(hythread_t thread);
 IDATA VMCALL hythread_thread_unlock(hythread_t thread);

Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/framework/testframe.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/framework/testframe.h?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/framework/testframe.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/framework/testframe.h Fri Aug 17 10:46:01 2007
@@ -22,6 +22,8 @@
 #ifndef _TESTFRAME_H_
 #define _TESTFRAME_H_
 
+#include <stdlib.h>
+
 #ifdef  __cplusplus
 extern "C" {
 #endif

Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_java_basic.c Fri Aug 17 10:46:01 2007
@@ -67,7 +67,7 @@
     tested_thread_sturct_t * tts;
 
     // Initialize tts structures and run all tested threads
-    tested_os_threads_run(run_for_test_jthread_attach);
+    tested_os_threads_run((hythread_entrypoint_t)run_for_test_jthread_attach);
     
     // Make second attach to the same jthread.
     reset_tested_thread_iterator(&tts);
@@ -222,7 +222,7 @@
     } else {
         // wait until timeout or previous thread ends 
         status = jthread_timed_join(prev_tts->java_thread, timed_join_wait_time, 0);
-        printf("-------- status = %08x (%i) %i\n", status,  status, timed_join_wait_time);
+        printf("-------- status = %#08x (%d) %d\n", (int)status, (int)status, timed_join_wait_time);
         tts->phase = TT_PHASE_DEAD;
         if (timed_join_wait_time > CLICK_TIME_MSEC * 10){
             // must be thread end

Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_basic.c Fri Aug 17 10:46:01 2007
@@ -40,8 +40,8 @@
 int test_hythread_create(void){
     apr_pool_t *pool;
     void **args; 
-    hythread_t thread = NULL;
-    int r;
+    hythread_t thread;
+    IDATA r;
     
     apr_pool_create(&pool, NULL);
 
@@ -53,7 +53,10 @@
     ((jthread_threadattr_t *)args[1])->stacksize = 1024000;
     ((jthread_threadattr_t *)args[1])->priority  = 1;
     
-    r = hythread_create_with_group(&thread, args[0], 1024000, 1, 0, start_proc, args);
+    thread = (hythread_t)calloc(1, hythread_get_struct_size());
+    assert(thread);
+    r = hythread_create_with_group(thread, args[0], 1024000, 1,
+        (hythread_entrypoint_t)start_proc, args);
     tf_assert(r == 0 && "thread creation failed");
 
     r = hythread_join(thread);
@@ -107,8 +110,10 @@
     hylatch_create(&end, 1);
 
     for (i = 0; i < n; i++) {
-        thread = NULL;
-        hythread_create_with_group(&thread, group, 0, 0, 0, start_proc_empty, NULL);
+        thread = (hythread_t)calloc(1, hythread_get_struct_size());
+        assert(thread);
+        hythread_create_with_group(thread, group, 0, 0,
+            (hythread_entrypoint_t)start_proc_empty, NULL);
     }
 
     // Wait util all threads have started.
@@ -117,7 +122,7 @@
     // Notify all threads
     hylatch_count_down(end);
 
-    printf ("iterator size: %d\n", hythread_iterator_size(iterator));
+    printf ("iterator size: %d\n", (int)hythread_iterator_size(iterator));
     tf_assert(hythread_iterator_size(iterator) == n);
     i = 0;
     while(hythread_iterator_has_next(iterator)) {
@@ -145,8 +150,10 @@
     hylatch_create(&end, 1);
 
     for (i = 0; i < n; i++) {
-        thread = NULL;
-        hythread_create(&thread, 0, 0, 0, start_proc_empty, NULL);
+        thread = (hythread_t)calloc(1, hythread_get_struct_size());
+        assert(thread);
+        hythread_create_with_group(thread, NULL, 0, 0,
+            (hythread_entrypoint_t)start_proc_empty, NULL);
     }
 
     // Wait util all threads have started.
@@ -155,7 +162,7 @@
     // Notify all threads
     hylatch_count_down(end);
 
-    printf("default group iterator: %d\n", hythread_iterator_size(iterator));
+    printf("default group iterator: %d\n", (int)hythread_iterator_size(iterator));
     tf_assert(hythread_iterator_size(iterator) >= n);
     i = 0;
     while(hythread_iterator_has_next(iterator)) {
@@ -182,7 +189,7 @@
     void **args; 
     hythread_t thread = NULL;
     hythread_group_t group = NULL;
-    int r;
+    IDATA r;
     
     char *buf;
     int i = 10;
@@ -199,9 +206,10 @@
         ((jthread_threadattr_t *)args[1])->stacksize = 1024000;
         ((jthread_threadattr_t *)args[1])->priority  = 1;
         
-        thread = NULL;
-
-        r = hythread_create_with_group(&thread, group, 1024000, 1, 0, start_proc, args);
+        thread = (hythread_t)calloc(1, hythread_get_struct_size());
+        assert(thread);
+        r = hythread_create_with_group(thread, group, 1024000, 1,
+            (hythread_entrypoint_t)start_proc, args);
         tf_assert(r == 0 && "thread creation failed");
         buf = (char *)apr_pcalloc(pool, sizeof(char)*12);
 

Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_fat_monitor.c Fri Aug 17 10:46:01 2007
@@ -60,8 +60,10 @@
     waiting_count = 0;
 
     for (i = 0; i < NMB; i++){
-        threads[i] = NULL;
-        hythread_create(&threads[i], 0, 0, 0, run_for_test_wait_signal, NULL);
+        threads[i] = (hythread_t)calloc(1, hythread_get_struct_size());
+        assert(threads[i]);
+        hythread_create_with_group(threads[i], NULL, 0, 0,
+            (hythread_entrypoint_t)run_for_test_wait_signal, NULL);
     }
 
     // Wait till all tested threads call wait() 

Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_suspend.c Fri Aug 17 10:46:01 2007
@@ -28,7 +28,7 @@
 int test_hythread_thread_suspend(void){
     apr_pool_t *pool;
     void **args; 
-    hythread_t thread = NULL;
+    hythread_t thread;
     hythread_thin_monitor_t lockword_ptr;
     IDATA status;
     int i;
@@ -41,7 +41,10 @@
 
     args[0] = &lockword_ptr;
     args[1] = 0;
-    hythread_create(&thread, 0, 0, 0, start_proc, args);
+    thread = (hythread_t)calloc(1, hythread_get_struct_size());
+    assert(thread);
+    hythread_create_with_group(thread, NULL, 0, 0,
+        (hythread_entrypoint_t)start_proc, args);
     hythread_sleep(500); 
     hythread_suspend_other(thread);
     hythread_suspend_disable();
@@ -63,7 +66,7 @@
     
     hythread_join(thread);
     
-    tf_assert_same((int)args[1], 1);
+    tf_assert_same((IDATA)args[1], 1);
 
     return 0;
 }
@@ -86,8 +89,10 @@
     args[0] = lockword_ptr;
     args[1] = 0;
     for(i = 0; i < 10; i++) {
-        thread = NULL;
-        hythread_create(&thread, 0, 0, 0, start_proc, args);
+        thread = (hythread_t)calloc(1, hythread_get_struct_size());
+        assert(thread);
+        hythread_create_with_group(thread, NULL, 0, 0,
+            (hythread_entrypoint_t)start_proc, args);
     } 
     hythread_sleep(500); 
     hythread_suspend_all(NULL, ((HyThread_public*)hythread_self())->group);

Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/test_native_thin_monitor.c Fri Aug 17 10:46:01 2007
@@ -106,7 +106,7 @@
     tf_assert_same(status, TM_ERROR_NONE);
 
     status = hythread_thin_monitor_wait_timed(&lockword_ptr, 1000,100);
-    printf("status: %d\n", status);
+    printf("status: %d\n", (int)status);
     tf_assert_same(status, TM_ERROR_TIMEOUT);
 
     status = hythread_thin_monitor_exit(&lockword_ptr);
@@ -119,7 +119,7 @@
 int test_hythread_thin_monitor_enter_contended(void){
     apr_pool_t *pool;
     void **args; 
-    hythread_t thread = NULL;
+    hythread_t thread;
     hythread_thin_monitor_t lockword_ptr;
     IDATA status;
     int i;
@@ -137,7 +137,10 @@
 
     args[0] = &lockword_ptr;
     args[1] = 0;
-    status = hythread_create(&thread, 0, 0, 0, start_proc, args);
+    thread = (hythread_t)calloc(1, hythread_get_struct_size());
+    assert(thread);
+    status = hythread_create_with_group(thread, NULL, 0, 0,
+        (hythread_entrypoint_t)start_proc, args);
     tf_assert_same(status, TM_ERROR_NONE);
     for(i = 0; i < 100000; i++) {
         tf_assert_same(args[1], 0);
@@ -153,9 +156,9 @@
     status = hythread_thin_monitor_enter(&lockword_ptr);
     tf_assert_same(status, TM_ERROR_NONE);
     args[1] = 0;
-    thread = NULL;
     hythread_suspend_enable();    
-    status = hythread_create(&thread, 0, 0, 0, start_proc, args);
+    status = hythread_create_with_group(thread, NULL, 0, 0,
+        (hythread_entrypoint_t)start_proc, args);
     tf_assert_same(status, TM_ERROR_NONE);
     for(i = 0; i < 100000; i++) {
         tf_assert_same(args[1], 0);
@@ -167,7 +170,7 @@
 
     hythread_join(thread);
     
-    tf_assert_same((int)args[1], 1);
+    tf_assert_same((IDATA)args[1], 1);
 
     return 0;
 }

Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c Fri Aug 17 10:46:01 2007
@@ -19,11 +19,11 @@
 #include "jni.h"
 #include "testframe.h"
 #include "thread_unit_test_utils.h"
-#include <open/jthread.h>
-#include <open/hythread.h>
-#include <open/hythread_ext.h>
-#include <open/ti_thread.h>
-#include <open/thread_externals.h>
+#include "open/jthread.h"
+#include "open/hythread.h"
+#include "open/hythread_ext.h"
+#include "open/ti_thread.h"
+#include "open/thread_externals.h"
 #include "apr_time.h"
 
 
@@ -269,10 +269,11 @@
     reset_tested_thread_iterator(&tts);
     while(next_tested_thread(&tts)){
         // Create thread
-        status = hythread_create(&tts->native_thread,  // new thread OS handle 
-                                 0, 5, 0,
-                                 run_method_param, // start proc
-                                 tts); 
+        tts->native_thread =
+            (hythread_t)calloc(1, hythread_get_struct_size());
+        assert(tts->native_thread);
+        status = hythread_create_with_group(tts->native_thread,
+            NULL, 0, 5, run_method_param, tts);
         tf_assert_v(status == TM_ERROR_NONE);
         tested_thread_wait_started(tts);
     }

Modified: harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h Fri Aug 17 10:46:01 2007
@@ -15,6 +15,7 @@
  *  limitations under the License.
  */
 
+#include <stdlib.h>
 #include "jvmti_types.h"
 #include "apr_thread_proc.h"
 #include "open/hycomp.h"

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.def Fri Aug 17 10:46:01 2007
@@ -1,4 +1,4 @@
-LIBRARY	HYTHR
+LIBRARY HYTHR
 
 EXPORTS
  
@@ -40,6 +40,7 @@
 hythread_tls_get
 hythread_tls_get_request_offset
 hythread_tls_get_offset
+hythread_get_struct_size
 hythread_global_lock
 hythread_global_unlock
 hythread_attach_to_group
@@ -88,9 +89,6 @@
 hythread_native_resource_is_live
 hythread_reclaim_resources
 
-
-
-
 hysem_post
 hysem_wait
 hysem_destroy
@@ -120,7 +118,6 @@
 hymutex_trylock
 hymutex_unlock
 hymutex_destroy
-
 
 hythread_is_alive
 hythread_is_terminated

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/hythr.exp Fri Aug 17 10:46:01 2007
@@ -41,6 +41,7 @@
 hythread_get_hythread_offset_in_tls;
 hythread_uses_fast_tls;
 hythread_tls_get_offset;
+hythread_get_struct_size;
 hythread_global_lock;
 hythread_global_unlock;
 hythread_attach_to_group;

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/linux/os_thread.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/linux/os_thread.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/linux/os_thread.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/linux/os_thread.c Fri Aug 17 10:46:01 2007
@@ -50,23 +50,23 @@
         int (VMAPICALL *func)(void*), void *data)
 {
     pthread_t thread;
-    pthread_attr_t attr, *pattr = NULL;
+    pthread_attr_t attr;
     int r;
 
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
     if (stacksize != 0) {
-	pattr = &attr;
-	pthread_attr_init(pattr);
-	r = pthread_attr_setstacksize(pattr, stacksize);
+	r = pthread_attr_setstacksize(&attr, stacksize);
 	if (r) {
-	    pthread_attr_destroy(pattr);
+	    pthread_attr_destroy(&attr);
 	    return r;
 	}
     }
 
-    r = pthread_create(&thread, pattr, (void*(*)(void*))func, data);
+    r = pthread_create(&thread, &attr, (void*(*)(void*))func, data);
 
-    if (pattr)
-	pthread_attr_destroy(pattr);
+    pthread_attr_destroy(&attr);
 
     if (r == 0) {
         *phandle = thread;

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_init.c Fri Aug 17 10:46:01 2007
@@ -73,8 +73,6 @@
  * @param[out] lib pointer to the created thread library
  * @return The thread library's initStatus will be set to 0 on success or 
  * a negative value on failure.
- * 
- * @see hythread_attach, hythread_shutdown
  */
 IDATA VMCALL hythread_lib_create(hythread_library_t * lib) {
     apr_status_t apr_status;
@@ -121,8 +119,6 @@
  * @param[in] lib pointer to the thread library to be initialized (non-NULL)
  * @return The thread library's initStatus will be set to 0 on success or 
  * a negative value on failure.
- * 
- * @see hythread_attach, hythread_shutdown
  */
 void VMCALL hythread_init(hythread_library_t lib) {
     apr_status_t apr_status;

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_basic.c Fri Aug 17 10:46:01 2007
@@ -47,8 +47,6 @@
 extern hythread_group_t TM_DEFAULT_GROUP;
 extern hythread_library_t TM_LIBRARY;
 static int VMAPICALL thread_start_proc(void *arg);
-static hythread_t allocate_thread();
-static void reset_thread(hythread_t thread);
 static IDATA register_to_group(hythread_t thread, hythread_group_t group);
 
 #define NAKED __declspec(naked)
@@ -98,30 +96,28 @@
  * @param[in] func function to run in the new thread
  * @param[in] data argument to be passed to starting function
  */
-IDATA VMCALL hythread_create_with_group(hythread_t *ret_thread, hythread_group_t group, UDATA stacksize, UDATA priority, UDATA suspend, hythread_entrypoint_t func, void *data) {
-    hythread_t  new_thread;
+IDATA VMCALL hythread_create_with_group(hythread_t new_thread,
+                                        hythread_group_t group,
+                                        UDATA stacksize,
+                                        UDATA priority,
+                                        hythread_entrypoint_t func,
+                                        void *data)
+{
+    int result;
+    hythread_t self;
     thread_start_proc_data * start_proc_data;
-    int r;
-   
-    if (ret_thread) {
-        hythread_struct_init(ret_thread);
-        new_thread = *ret_thread;
-    } else {
-        new_thread = allocate_thread();
-    }
-    
-    if (new_thread == NULL) {
-        return TM_ERROR_OUT_OF_MEMORY;
-    }
 
-    new_thread->library = hythread_self()->library;
+    assert(new_thread);
+    hythread_struct_init(new_thread);
+
+    self = hythread_self();
+    new_thread->library = self ? self->library : TM_LIBRARY;
     new_thread->priority = priority ? priority : HYTHREAD_PRIORITY_NORMAL;
     new_thread->stacksize = stacksize ? stacksize : TM_DEFAULT_STACKSIZE;
-    //new_thread->suspend_request = suspend ? 1 : 0;
     
+    // No need to zero allocated memory because all fields are initilized below.
     start_proc_data =
         (thread_start_proc_data *) malloc(sizeof(thread_start_proc_data));
-
     if (start_proc_data == NULL) {
         return TM_ERROR_OUT_OF_MEMORY;
     }
@@ -132,15 +128,15 @@
     start_proc_data->start_proc = func;
     start_proc_data->start_proc_args = data;
 
-    // we need to make sure thread will not register itself with a thread group
-    // until os_thread_create returned and initialized thread->os_handle properly
+    // Need to make sure thread will not register itself with a thread group
+    // until os_thread_create returned and initialized thread->os_handle properly.
     hythread_global_lock();
-    r = os_thread_create(&new_thread->os_handle, new_thread->stacksize,
+    result = os_thread_create(&new_thread->os_handle, new_thread->stacksize,
             priority, thread_start_proc, (void *)start_proc_data);
-    assert(/* error */ r || new_thread->os_handle /* or thread created ok */);
+    assert(/* error */ result || new_thread->os_handle /* or thread created ok */);
     hythread_global_unlock();
    
-    return r;
+    return result;
 }
 
 /**
@@ -164,48 +160,47 @@
  *
  * @see hythread_exit, hythread_resume
  */
-IDATA VMCALL hythread_create(hythread_t *ret_thread, UDATA stacksize, UDATA priority, UDATA suspend, hythread_entrypoint_t func, void *data) {
-    return hythread_create_with_group(ret_thread, NULL, stacksize, priority, suspend, func, data);
+IDATA VMCALL hythread_create(hythread_t *handle, UDATA stacksize, UDATA priority, UDATA suspend, hythread_entrypoint_t func, void *data) {
+    hythread_t thread = (hythread_t)calloc(1, hythread_get_struct_size());
+    assert(thread);
+    if (handle) {
+        *handle = thread;
+    }
+    return hythread_create_with_group(thread, NULL, stacksize, priority, func, data);
 }
 
 /**
  * Registers the current OS thread with the threading subsystem.
  *
- * @param[in] handle thread to register
- * @param[in] lib thread library to attach to
- * @param[in] group thread group, or NULL; in case of NULL this thread will go to the default group
- */
-IDATA hythread_attach_to_group(hythread_t * handle, hythread_library_t lib, hythread_group_t group) {
-    hythread_t thread;
-
-    if (lib == NULL) {
-        lib = TM_LIBRARY;
-    }
+ * @param[in] new_thread thread to register
+ * @param[in] lib        thread library to attach to
+ * @param[in] group      thread group, or NULL; in case of NULL this thread will
+ *                       go to the default group
+ */
+IDATA hythread_attach_to_group(hythread_t new_thread,
+                               hythread_library_t lib,
+                               hythread_group_t group)
+{
+    hythread_t self;
 
-    // Do nothing and return if the thread is already attached
-    thread = tm_self_tls;
-    if (thread) {
-        if (handle) {
-            *handle = thread;
-        }
+    assert(new_thread);
+    self = hythread_self();
+    if (self) {
+        // The thread is already attached, just fill a given thread structure.
+        *new_thread = *self;
         return TM_ERROR_NONE;
     }
-    if (handle) {
-        hythread_struct_init(handle);
-        thread = *handle;
-    } else {
-        thread = allocate_thread();
-    }
-    if (thread == NULL) {
-        return TM_ERROR_OUT_OF_MEMORY;
-    }
-    thread->library = lib;
-    thread->os_handle = os_thread_current();
-    assert(thread->os_handle);
 
-    TRACE(("TM: native attached: native: %p ",  tm_self_tls));
-    
-    return register_to_group(thread, group == NULL ? TM_DEFAULT_GROUP : group);
+    hythread_struct_init(new_thread);
+    assert(lib == NULL);
+    new_thread->library = TM_LIBRARY;
+    new_thread->os_handle = os_thread_current();
+    assert(new_thread->os_handle);
+
+    TRACE(("TM: native attached: native: %p ", self));
+
+    return register_to_group(new_thread,
+        (group == NULL ? TM_DEFAULT_GROUP : group));
 }
 
 /**
@@ -226,7 +221,12 @@
  * @see hythread_detach
  */
 IDATA VMCALL hythread_attach(hythread_t *handle) {
-    return hythread_attach_to_group(handle, TM_LIBRARY, NULL);
+    hythread_t thread = (hythread_t)calloc(1, hythread_get_struct_size());
+    assert(thread);
+    if (handle) {
+        *handle = thread;
+    }
+    return hythread_attach_to_group(thread, NULL, NULL);
 }
 
 /**
@@ -240,7 +240,8 @@
  * @see hythread_detach
  */
 IDATA VMCALL hythread_attach_ex(hythread_t *handle, hythread_library_t lib) {
-    return hythread_attach_to_group(handle, lib, NULL);
+    assert(handle);
+    return hythread_attach_to_group(*handle, NULL, NULL);
 }
 
 /**
@@ -256,8 +257,6 @@
  * @param[in] thread a hythread_t representing the thread to be detached.
  * If this is NULL, the current thread is detached.
  * @return none
- * 
- * @see hythread_attach
  */
 void VMCALL hythread_detach(hythread_t thread) {
     IDATA status;
@@ -272,9 +271,12 @@
 
     // No actions required in case the specified thread is detached already.
     if (thread->group != NULL) {
-        assert(thread == tm_self_tls);
-        
-        thread_set_self(NULL);
+        // The thread can be detached from the other thread in case
+        // of forceful termination by hythread_cancel(), but thread
+        // local storage can be zeroed only for current thread.
+        if (thread == hythread_self() ) {
+            thread_set_self(NULL);
+        }
         fast_thread_array[thread->thread_id] = NULL;
         
         thread->prev->next = thread->next;
@@ -330,27 +332,15 @@
     //apr_thread_yield returns void 
     apr_thread_yield();
 }
+
 /** 
  * Return the hythread_t for the current thread.
  * 
  * @note Must be called only by an attached thread
  * 
  * @return hythread_t for the current thread
- *
- * @see hythread_attach
- * 
  */
 #ifdef APR_TLS_USE
-/**
- * Return the hythread_t for the current thread.
- *
- * @note Must be called only by an attached thread
- *
- * @return hythread_t for the current thread
- *
- * @see hythread_attach
- *
- */
 hythread_t hythread_self_slow() {
     hythread_t  thread;
     apr_status_t UNUSED apr_status;
@@ -367,22 +357,12 @@
 }
 #else 
 #if defined(_WIN32) && defined(HYTHREAD_FAST_TLS)
-/**
- * Return the hythread_t for the current thread.
- *
- * @note Must be called only by an attached thread
- *
- * @return hythread_t for the current thread
- *
- * @see hythread_attach
- *
- */
+
 hythread_t hythread_self_slow() {
     return hythread_self();
 }
 
-static void thread_set_self(hythread_t  thread) {
-  // tm_self_tls = thread;
+static void thread_set_self(hythread_t thread) {
 #ifndef _WIN64
 #   if (_MSC_VER >= 1400)
         __writefsdword(offsetof(NT_TIB, ArbitraryUserPointer), thread);
@@ -396,17 +376,9 @@
     __writegsqword(offsetof(NT_TIB, ArbitraryUserPointer), thread);
 #endif
 }
-#else
-/**
- * Return the hythread_t for the current thread.
- *
- * @note Must be called only by an attached thread
- *
- * @return hythread_t for the current thread
- *
- * @see hythread_attach
- *
- */
+
+#else // defined(_WIN32) && defined(HYTHREAD_FAST_TLS)
+
 hythread_t hythread_self_slow() {
     return hythread_self();
 }
@@ -414,8 +386,8 @@
 static void thread_set_self(hythread_t  thread) {
     tm_self_tls = thread;
 }
-#endif
-#endif
+#endif // defined(_WIN32) && defined(HYTHREAD_FAST_TLS)
+#endif // defined APR_TLS_USE
 
 IDATA thread_sleep_impl(I_64 millis, IDATA nanos, IDATA interruptable) {
     IDATA status;
@@ -514,6 +486,7 @@
  * @return none
  */
 void VMCALL hythread_cancel(hythread_t thread) {
+    hythread_detach(thread);
     os_thread_cancel(thread->os_handle);
 }
 
@@ -540,23 +513,11 @@
             //make any sense to exit on error, but continue terminating threads
         }       
     }
+    hythread_iterator_release(&iter);
 
     return TM_ERROR_NONE;
 }
 
-/**
- * Allocates and initializes a new thread_t structure.
- *
- */
-IDATA VMCALL hythread_struct_init(hythread_t *ret_thread) {
-    assert(ret_thread);
-    if (*ret_thread) {
-        reset_thread(*ret_thread);
-        return TM_ERROR_NONE;
-    }
-    (*ret_thread) = allocate_thread();
-    return (*ret_thread) == NULL ? TM_ERROR_OUT_OF_MEMORY : TM_ERROR_NONE;
-}
 //==============================================================================
 // Private functions
 
@@ -615,65 +576,46 @@
     return hythread_global_unlock(NULL);    
 }
 
-/*
- * Allocates and initializes a new thread_t structure 
- *
- * @return created and initialized thread_t structure
+/**
+ * Initializes a new thread structure.
  */
-static hythread_t allocate_thread() {
-    hythread_t ptr;
+IDATA VMCALL hythread_struct_init(hythread_t new_thread) 
+{
     IDATA status;
 
-    ptr = (hythread_t )calloc(1, sizeof(HyThread));
-    if (ptr == NULL) return NULL;
+    assert(new_thread);
+    if (!new_thread->stacksize) {
+        // Create thread primitives
+        status = hylatch_create(&new_thread->join_event, 1);
+        assert(status == TM_ERROR_NONE);
+        status = hysem_create(&new_thread->resume_event, 0, 1);
+        assert(status == TM_ERROR_NONE);
+        status = hymutex_create(&new_thread->mutex, TM_MUTEX_NESTED);
+        assert(status == TM_ERROR_NONE);
+        status = hycond_create(&new_thread->condition);
+        assert(status == TM_ERROR_NONE);
+        new_thread->stacksize = os_get_foreign_thread_stack_size();
+    }
+
+    new_thread->os_handle  = (osthread_t)NULL;
+    new_thread->priority   = HYTHREAD_PRIORITY_NORMAL;
+
+    // Suspension reset
+    new_thread->request = 0;
+    new_thread->suspend_count = 0;
+    new_thread->disable_count = 0;
+    new_thread->safepoint_callback = NULL;
+
+    hymutex_lock(&new_thread->mutex);
+    new_thread->state = TM_THREAD_STATE_ALLOCATED;
+    hymutex_unlock(&new_thread->mutex);
 
-    ptr->os_handle  = (osthread_t)NULL;
-    ptr->priority   = HYTHREAD_PRIORITY_NORMAL;
-    ptr->stacksize  = os_get_foreign_thread_stack_size();
-    
-    // Suspension
-    ptr->request = 0;
-    ptr->suspend_count = 0;
-    ptr->disable_count = 0;
-    status = hylatch_create(&ptr->join_event, 1);
-    assert(status == TM_ERROR_NONE);
-    status = hysem_create(&ptr->resume_event, 0, 1);
-    assert(status == TM_ERROR_NONE);
-    status = hymutex_create(&ptr->mutex, TM_MUTEX_NESTED);
+    status = hylatch_set(new_thread->join_event, 1);
     assert(status == TM_ERROR_NONE);
-    status = hycond_create(&ptr->condition);
+    status = hysem_set(new_thread->resume_event, 0);
     assert(status == TM_ERROR_NONE);
-    
-    ptr->state = TM_THREAD_STATE_ALLOCATED;
-    return ptr;
-}
-
-static void reset_thread(hythread_t thread) {
-    IDATA UNREF status;
-    if (thread->os_handle) {
-        int UNREF res = os_thread_join(thread->os_handle);
-        assert(!res);
-    }
-
-    hymutex_lock(&thread->mutex);
 
-    thread->os_handle  = (osthread_t)NULL;
-    thread->priority   = HYTHREAD_PRIORITY_NORMAL;
-
-    // Suspension
-    thread->request = 0;
-    thread->suspend_count = 0;
-    thread->disable_count = 0;
-    thread->safepoint_callback = NULL;
-    thread->state = TM_THREAD_STATE_ALLOCATED;
-
-    hymutex_unlock(&thread->mutex);
-
-    status = hylatch_set(thread->join_event, 1);
-    assert(status == TM_ERROR_NONE);
-    status = hysem_set(thread->resume_event, 0);
-    assert(status == TM_ERROR_NONE);
-    
+    return TM_ERROR_NONE;
 }
 
 // Wrapper around user thread start proc. Used to perform some duty jobs 
@@ -726,13 +668,13 @@
 }
 
 extern HY_CFUNC void VMCALL 
-    hythread_exit (hythread_monitor_t monitor) {
+hythread_exit (hythread_monitor_t monitor) {
    
     if (monitor !=NULL && monitor->owner == hythread_self()) {
         monitor->recursion_count = 0;
         hythread_monitor_exit(monitor);
     }
-
+    hythread_detach(NULL);
     os_thread_exit(0);
     // unreachable statement
     abort();
@@ -891,3 +833,9 @@
     status = hymutex_unlock(&lib->TM_LOCK);
     return status;
 } // hythread_countdown_nondaemon_threads
+
+IDATA VMCALL hythread_get_struct_size()
+{
+    return (IDATA)sizeof(HyThread);
+} // hythread_get_struct_size
+

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_fat_monitor.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_fat_monitor.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_fat_monitor.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_fat_monitor.c Fri Aug 17 10:46:01 2007
@@ -51,14 +51,16 @@
         return TM_ERROR_OUT_OF_MEMORY;
     }
     r = hymutex_create(&mon->mutex, TM_MUTEX_NESTED);
-    if (r) goto cleanup;
+    if (r) {
+        goto cleanup;
+    }
     r = hycond_create(&mon->condition);
-    if (r) goto cleanup;
+    if (r) {
+        goto cleanup;
+    }
 
     mon->flags = flags;
     mon->name  = name;
-    mon->owner = 0;
-    mon->notify_flag = 0;
 
     *mon_ptr = mon;
     return TM_ERROR_NONE;
@@ -165,10 +167,6 @@
         return TM_ERROR_ILLEGAL_STATE;
     }
 
-#ifdef _DEBUG
-    mon_ptr->last_wait=tm_self_tls;
-#endif
-
     saved_recursion = mon_ptr->recursion_count;
 
     assert(saved_recursion>=0);
@@ -184,12 +182,15 @@
 
     do {
         apr_time_t start;
-        assert(0 <= mon_ptr->notify_flag && mon_ptr->notify_flag < mon_ptr->wait_count);
+        assert(mon_ptr->notify_count >= 0);
+        assert(mon_ptr->notify_count < mon_ptr->wait_count);
         start = apr_time_now();
         status = condvar_wait_impl(&mon_ptr->condition, &mon_ptr->mutex, ms, nano, interruptable);
         if (status != TM_ERROR_NONE
-	                    || mon_ptr->notify_flag || hythread_interrupted(self))
+            || mon_ptr->notify_count || hythread_interrupted(self))
+        {
             break;
+        }
         // we should not change ms and nano if both are 0 (meaning "no timeout")
         if (ms || nano) {
             apr_interval_time_t elapsed;
@@ -209,14 +210,23 @@
             assert(0 <= nano && nano < 1000000);
         }
     } while (1);
-    if (mon_ptr->notify_flag)
-        mon_ptr->notify_flag -= 1;
+
+    // consume the notify_count unless we got an error
+    // or were interrupted
+    if (mon_ptr->notify_count > 0
+        && ((status == TM_ERROR_NONE && !hythread_interrupted(self))
+            || mon_ptr->notify_count == mon_ptr->wait_count))
+    {
+        mon_ptr->notify_count--;
+    }
+
     hymutex_lock(&self->mutex);
     self->state &= ~TM_THREAD_STATE_IN_MONITOR_WAIT;
     self->current_condition = NULL;
     self->waited_monitor = NULL;
     hymutex_unlock(&self->mutex);
     mon_ptr->wait_count--;
+    assert(mon_ptr->notify_count <= mon_ptr->wait_count);
 
     if (self->request) {
         int save_count;
@@ -326,7 +336,7 @@
     if (mon_ptr->owner != tm_self_tls) {
         return TM_ERROR_ILLEGAL_STATE;
     }
-    mon_ptr->notify_flag = mon_ptr->wait_count;
+    mon_ptr->notify_count = mon_ptr->wait_count;
     return hycond_notify_all(&mon_ptr->condition);
 }
 
@@ -372,8 +382,8 @@
     if (mon_ptr->owner != tm_self_tls) {
         return TM_ERROR_ILLEGAL_STATE;
     }
-    if (mon_ptr->notify_flag < mon_ptr->wait_count)
-        mon_ptr->notify_flag += 1;
+    if (mon_ptr->notify_count < mon_ptr->wait_count)
+        mon_ptr->notify_count += 1;
     return hycond_notify(&mon_ptr->condition);
 }
 

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_interrupt.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_interrupt.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_interrupt.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_interrupt.c Fri Aug 17 10:46:01 2007
@@ -37,7 +37,6 @@
  */
 void VMCALL hythread_interrupt(hythread_t thread) {
     IDATA status;
-    hythread_t thr = NULL;
     hymutex_lock(&thread->mutex);
     thread->state |= TM_THREAD_STATE_INTERRUPTED;
     
@@ -49,19 +48,20 @@
     // If thread was doing any kind of wait, notify it.
     if (thread->state & (TM_THREAD_STATE_PARKED | TM_THREAD_STATE_SLEEPING)) {
         if (thread->current_condition) {
-	    status = hycond_notify_all(thread->current_condition);
-	    assert(status == TM_ERROR_NONE);
-	}
+            status = hycond_notify_all(thread->current_condition);
+            assert(status == TM_ERROR_NONE);
+        }
     } else if (thread->state & TM_THREAD_STATE_IN_MONITOR_WAIT) {
         if (thread->current_condition && (hythread_monitor_try_enter(thread->waited_monitor) == TM_ERROR_NONE)) {
             hythread_monitor_interrupt_wait(thread->waited_monitor, thread);
             hythread_monitor_exit(thread->waited_monitor);
         } else {
-            status = hythread_create(&thr, 0, 0, 0, interrupter_thread_function, (void *)thread);
+            hythread_t interrupt_thread = (hythread_t)calloc(1, hythread_get_struct_size());
+            status = hythread_create_with_group(interrupt_thread, 0, 0, 0,
+                interrupter_thread_function, (void *)thread);
             assert (status == TM_ERROR_NONE);
-	}
+        }
     }
-
     hymutex_unlock(&thread->mutex);
 }
 
@@ -81,7 +81,7 @@
     hymutex_unlock(&thread->mutex);
 
     hythread_monitor_enter(monitor);
-    hythread_monitor_notify_all(monitor);
+    hythread_monitor_interrupt_wait(monitor, thread);
 
     hythread_exit(monitor);
     return 0;

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_iterator.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_iterator.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_iterator.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_iterator.c Fri Aug 17 10:46:01 2007
@@ -28,7 +28,8 @@
 
 
 /**
- * Creates the iterator that can be used to retrieve all threads in the specific group.
+ * Creates the iterator that can be used to retrieve all threads in the specific group
+ * and acquires the thread lock.
  * 
  * @param[in] group thread group number
  */
@@ -42,7 +43,8 @@
 }
 
 /**
- * Releases the iterator over the specific thread group.
+ * Releases the iterator over the specific thread group and releases the thread
+ * lock.
  * 
  * @param[in] it thread group iterator
  */

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_native_thin_monitor.c Fri Aug 17 10:46:01 2007
@@ -125,7 +125,6 @@
 int inflate_contended=0;
 int inflate_waited=0;
 int unreserve_count_self=0;
-int inflate_count=0;
 int fat_lock2_count = 0;
 int init_reserve_cout = 0;
 int cas_cout = 0;
@@ -622,7 +621,6 @@
     // however this invariant is true because we hold monitor->mutex during this function
     // so it cannot be called twice for the signle monitor concurrently
 
-    TRACE(("inflate tmj%d\n", ++inflate_count));
     lockword = *lockword_ptr;
     if (IS_FAT_LOCK (lockword)) {
         return locktable_get_fat_monitor(FAT_LOCK_ID(lockword));
@@ -657,8 +655,6 @@
     TRACE(("hythread_inflate_lock  %d thread: %d\n", FAT_LOCK_ID(*lockword_ptr), tm_self_tls->thread_id));
     //assert(FAT_LOCK_ID(*lockword_ptr) != 2);
     TRACE(("FAT ID : 0x%x", *lockword_ptr));
-    fat_monitor->inflate_count++;
-    fat_monitor->inflate_owner=tm_self_tls;
 #ifdef LOCK_RESERVATION
     assert(!IS_RESERVED(*lockword_ptr));
 #endif

Modified: harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/thread/src/thread_private.h Fri Aug 17 10:46:01 2007
@@ -214,7 +214,6 @@
      * Handle to OS thread.
      */
     osthread_t os_handle;
-    
 
 // Synchronization stuff
 
@@ -328,30 +327,27 @@
  */
 typedef struct HyThreadMonitor {
     
-    /**
-     * Mutex
-     */
+    /// Monitor mutex.
     hymutex_t mutex;
 
-    /**
-     * Condition variable
-     */
+    /// Monitor condition varibale.
     hycond_t condition;
     
-    /**
-     * Recursion count 
-     */
+    /// Mutex recurtion count.
     IDATA recursion_count;
-    hythread_t owner; 
-    hythread_t inflate_owner;
-    hythread_t last_wait;
-    int inflate_count;
+
+    /// Current mutex owner.
+    hythread_t owner;
+
+    /// Number of threads waiting on a condition variable
+    /// or queued to acquire a monitor mutex after wakeup
     int wait_count;
-    int notify_flag;
 
-    /**
-     * Owner thread ID. 
-     */
+    /// Number of notify events sent by the user,
+    /// it is bounded by the wait_count
+    int notify_count;
+
+    /// Owner thread ID. 
     IDATA thread_id;
 
     UDATA flags;
@@ -510,7 +506,6 @@
 int os_thread_set_priority(osthread_t thread, int priority);
 osthread_t os_thread_current();
 int os_thread_cancel(osthread_t);
-int os_thread_join(osthread_t);
 void os_thread_exit(IDATA status);
 void os_thread_yield_other(osthread_t);
 int os_get_thread_times(osthread_t os_thread, int64* pkernel, int64* puser);

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/finalizer_thread.cpp Fri Aug 17 10:46:01 2007
@@ -109,8 +109,9 @@
         void **args = (void **)STD_MALLOC(sizeof(void *) * 2);
         args[0] = (void*)java_vm;
         args[1] = (void*)get_system_thread_group(jni_env);
-        fin_thread_info->thread_ids[i] = NULL;
-        status = hythread_create(&fin_thread_info->thread_ids[i], 0, FINALIZER_THREAD_PRIORITY, 0, (hythread_entrypoint_t)finalizer_thread_func, args);
+        fin_thread_info->thread_ids[i] = (hythread_t)STD_CALLOC(1, hythread_get_struct_size());
+        status = hythread_create_with_group(fin_thread_info->thread_ids[i], NULL, 0,
+            FINALIZER_THREAD_PRIORITY, (hythread_entrypoint_t)finalizer_thread_func, args);
         assert(status == TM_ERROR_NONE);
         hysem_wait(fin_thread_info->attached_sem);
     }    

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/ref_enqueue_thread.cpp Fri Aug 17 10:46:01 2007
@@ -65,7 +65,9 @@
     void **args = (void **)STD_MALLOC(sizeof(void *)*2);
     args[0] = (void *)java_vm;
     args[1] = (void*)get_system_thread_group(jni_env);
-    status = hythread_create(NULL, 0, REF_ENQUEUE_THREAD_PRIORITY, 0, (hythread_entrypoint_t)ref_enqueue_thread_func, args);
+    hythread_t thread = (hythread_t)STD_CALLOC(1, hythread_get_struct_size());
+    status = hythread_create_with_group(thread, NULL, 0, REF_ENQUEUE_THREAD_PRIORITY,
+        (hythread_entrypoint_t)ref_enqueue_thread_func, args);
     assert(status == TM_ERROR_NONE);
     
     hysem_wait(ref_thread_info->attached_sem);

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp Fri Aug 17 10:46:01 2007
@@ -598,14 +598,17 @@
 
     native_thread = hythread_self();
     if (!native_thread) {
-        status = (jint)hythread_attach_to_group(&native_thread,
-            ((JavaVM_Internal *)java_vm)->vm_env->hythread_lib, NULL);
-        if (status != TM_ERROR_NONE) return JNI_ERR;
+        hythread_t native_thread = (hythread_t)STD_CALLOC(1, hythread_get_struct_size());
+        assert(native_thread);
+        IDATA hy_status = hythread_attach_to_group(native_thread, NULL, NULL);
+        if (hy_status != TM_ERROR_NONE)
+            return JNI_ERR;
     }
     assert(native_thread);
 
     status = vm_attach(java_vm, &jni_env);
-    if (status != JNI_OK) return status;
+    if (status != JNI_OK)
+        return status;
 
     *p_jni_env = jni_env;
 
@@ -630,7 +633,9 @@
 
     vm_env = java_vm->vm_env;
 
-    if (hythread_attach_ex(NULL, vm_env->hythread_lib) != TM_ERROR_NONE) {
+    hythread_t main_thread = (hythread_t)STD_CALLOC(1, hythread_get_struct_size());
+    assert(main_thread);
+    if (hythread_attach_to_group(main_thread, NULL, NULL) != TM_ERROR_NONE) {
         return JNI_ERR;
     }
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_shutdown.cpp Fri Aug 17 10:46:01 2007
@@ -309,28 +309,36 @@
 
     status = JNI_GetCreatedJavaVMs(NULL, 0, &nVMs);
     assert(nVMs <= 1);
-    if (status != JNI_OK) return;
+    if (status != JNI_OK)
+        return;
 
     vmBuf = (JavaVM **) STD_MALLOC(nVMs * sizeof(JavaVM *));
     status = JNI_GetCreatedJavaVMs(vmBuf, nVMs, &nVMs);
     assert(nVMs <= 1);
-    if (status != JNI_OK) goto cleanup;
-
-    status = hythread_attach(NULL);
-    if (status != TM_ERROR_NONE) goto cleanup;
-
+    if (status != JNI_OK)
+        goto cleanup;
 
     threadBuf = (hythread_t *) STD_MALLOC((nVMs + 1) * sizeof(hythread_t));
-    threadBuf[nVMs] = NULL;
+    assert(threadBuf);
 
     // Create a new thread for each VM to avoid scalability and deadlock problems.
     for (int i = 0; i < nVMs; i++) {
-        threadBuf[i] = NULL;
-        hythread_create((threadBuf + i), 0, HYTHREAD_PRIORITY_NORMAL, 0, vm_interrupt_entry_point, (void *)vmBuf[i]);
+        threadBuf[i] = (hythread_t)STD_CALLOC(1, hythread_get_struct_size());
+        assert(threadBuf[i]);
+        status = hythread_create_with_group(threadBuf[i], NULL, 0,
+            HYTHREAD_PRIORITY_NORMAL, vm_interrupt_entry_point, (void *)vmBuf[i]);
+        assert(status == TM_ERROR_NONE);
     }
 
     // spawn a new thread which will terminate the process.
-    hythread_create(NULL, 0, HYTHREAD_PRIORITY_NORMAL, 0, vm_interrupt_process, (void *)threadBuf);
+    threadBuf[nVMs] = (hythread_t)STD_CALLOC(1, hythread_get_struct_size());
+    assert(threadBuf[nVMs]);
+    status = hythread_create_with_group(threadBuf[nVMs], NULL, 0,
+        HYTHREAD_PRIORITY_NORMAL, vm_interrupt_process, (void *)threadBuf);
+    assert(status == TM_ERROR_NONE);
+
+    // set a NULL terminator
+    threadBuf[nVMs] = NULL;
 
 cleanup:
     STD_FREE(vmBuf);
@@ -347,21 +355,22 @@
 
     status = JNI_GetCreatedJavaVMs(NULL, 0, &nVMs);
     assert(nVMs <= 1);
-    if (status != JNI_OK) return;
+    if (status != JNI_OK)
+        return;
 
     vmBuf = (JavaVM **) STD_MALLOC(nVMs * sizeof(JavaVM *));
     status = JNI_GetCreatedJavaVMs(vmBuf, nVMs, &nVMs);
     assert(nVMs <= 1);
-
-    IDATA htstatus;
-    if (status != JNI_OK) goto cleanup;
-
-    htstatus = hythread_attach(NULL);
-    if (htstatus != TM_ERROR_NONE) goto cleanup;
+    if (status != JNI_OK)
+        goto cleanup;
 
     // Create a new thread for each VM to avoid scalability and deadlock problems.
     for (int i = 0; i < nVMs; i++) {
-        hythread_create(NULL, 0, HYTHREAD_PRIORITY_NORMAL, 0, vm_dump_entry_point, (void *)vmBuf[i]);
+        hythread_t thread = (hythread_t)STD_CALLOC(1, hythread_get_struct_size());
+        assert(thread);
+        IDATA hy_status = hythread_create_with_group(thread, NULL, 0,
+            HYTHREAD_PRIORITY_NORMAL, vm_dump_entry_point, (void *)vmBuf[i]);
+        assert(hy_status == TM_ERROR_NONE);
     }
 
 cleanup:

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_event.cpp Fri Aug 17 10:46:01 2007
@@ -2313,7 +2313,9 @@
 
     // create TI event thread
     JNIEnv *jni_env = p_TLS_vmthread->jni_env;
-    IDATA status = hythread_create(&ti->event_thread, 0, 0, 0,
+    ti->event_thread = (hythread_t)STD_CALLOC(1, hythread_get_struct_size());
+    assert(ti->event_thread);
+    IDATA status = hythread_create_with_group(ti->event_thread, NULL, 0, 0,
         jvmti_event_thread_function, jni_env);
     if( status != TM_ERROR_NONE ) {
         DIE("jvmti_create_event_thread: creating thread is failed!");

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_basic.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_basic.cpp?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_basic.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_java_basic.cpp Fri Aug 17 10:46:01 2007
@@ -124,16 +124,7 @@
         return TM_ERROR_NULL_POINTER;
     }
     hythread_t native_thread = vm_jthread_get_tm_data(java_thread);
-
-    // This is for irregular use. In ordinary live valid jthread instance
-    // contains weak reference associated with it and native thread to reuse. 
-    if (native_thread == NULL) {
-        assert(0);
-        if (!jthread_thread_init(jni_env, java_thread, NULL, 0)) {
-            return TM_ERROR_OUT_OF_MEMORY;
-        }
-        native_thread = vm_jthread_get_tm_data(java_thread);
-    }
+    assert(native_thread);
 
     vm_thread_t vm_thread =
         (vm_thread_t) hythread_tls_get(native_thread, TM_THREAD_VM_TLS_KEY);
@@ -164,9 +155,8 @@
         attrs->stacksize = default_stacksize;
     }
 
-    status =
-        hythread_create(&native_thread, attrs->stacksize,
-                        attrs->priority, 0, jthread_wrapper_proc, attrs);
+    status = hythread_create_with_group(native_thread, NULL, attrs->stacksize,
+                        attrs->priority, jthread_wrapper_proc, attrs);
 
     TRACE(("TM: Created thread: id=%d", hythread_get_id(native_thread)));
 
@@ -242,9 +232,12 @@
             // delete used weak reference
             env->DeleteGlobalRef(vm_thread->weak_ref);
         }
+    } else {
+        native_thread = (hythread_t)STD_CALLOC(1, hythread_get_struct_size());
+        assert(native_thread);
     }
     
-    IDATA status = hythread_struct_init(&native_thread);
+    IDATA status = hythread_struct_init(native_thread);
     if (status != TM_ERROR_NONE) {
         return 0;
     }
@@ -403,11 +396,31 @@
  */
 static void stop_callback(void)
 {
-    vm_thread_t vm_thread = p_TLS_vmthread;
+    hythread_t native_thread = hythread_self();
+    assert(native_thread);
+    vm_thread_t vm_thread =
+        (vm_thread_t) hythread_tls_get(native_thread, TM_THREAD_VM_TLS_KEY);
     assert(vm_thread);
     jobject excn = vm_thread->stop_exception;
 
+    // Does not return if the exception could be thrown straight away
     jthread_throw_exception_object(excn);
+
+    // getting here means top stack frame is non-unwindable.
+    if (hythread_get_state(native_thread) &
+            (TM_THREAD_STATE_SLEEPING | TM_THREAD_STATE_WAITING_WITH_TIMEOUT
+                | TM_THREAD_STATE_WAITING | TM_THREAD_STATE_IN_MONITOR_WAIT
+                | TM_THREAD_STATE_WAITING_INDEFINITELY | TM_THREAD_STATE_PARKED))
+    {
+        // This is needed for correct stopping of a thread blocked on monitor_wait.
+        // The thread needs some flag to exit its waiting loop.
+        // We piggy-back on interrupted status. A correct exception from TLS
+        // will be thrown because the check of exception status on leaving
+        // JNI frame comes before checking return status in Object.wait().
+        // Interrupted status will be cleared by function returning TM_ERROR_INTERRUPT.
+        // (though, in case of parked thread, it will not be cleared)
+        hythread_interrupt(native_thread);
+    }
 } // stop_callback
 
 /**

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp?view=diff&rev=567096&r1=567095&r2=567096
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/thread_manager.cpp Fri Aug 17 10:46:01 2007
@@ -117,11 +117,10 @@
 #endif // _DEBUG
 
     // allocate VM thread
-    vm_thread = (vm_thread_t)STD_MALLOC(sizeof(VM_thread));
+    vm_thread = (vm_thread_t)STD_CALLOC(1, sizeof(VM_thread));
     if (!vm_thread) {
         return NULL;
     }
-    memset(vm_thread, 0, sizeof(VM_thread));
 
     // set VM thread to thread local storage
     IDATA status =