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 [16/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/...
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.cpp Wed Aug 23 09:48:41 2006
@@ -21,12 +21,10 @@
#define LOG_DOMAIN "kernel"
#include "cxxlog.h"
-#include "thread_generic.h"
-#include "object_handles.h"
-#include "mon_enter_exit.h"
-#include "open/thread.h"
-
#include "java_lang_VMThreadManager.h"
+#include "open/hythread_ext.h"
+#include "open/jthread.h"
+#include "open/thread_externals.h"
/*
* Class: java_lang_VMThreadManager
@@ -34,9 +32,9 @@
* Signature: ()Ljava/lang/Thread;
*/
JNIEXPORT jobject JNICALL Java_java_lang_VMThreadManager_currentThread
- (JNIEnv * UNREF jenv, jclass)
+ (JNIEnv * UNREF jenv, jclass clazz)
{
- return thread_current_thread();
+ return jthread_self();
}
/*
@@ -45,31 +43,20 @@
* Signature: (Ljava/lang/Object;)Z
*/
JNIEXPORT jboolean JNICALL Java_java_lang_VMThreadManager_holdsLock
- (JNIEnv * UNREF jenv, jclass, jobject lock)
+ (JNIEnv * UNREF jenv, jclass clazz, jobject monitor)
{
- //ToDo: the following code will be used.
- //return thread_holds_lock(thread_current_thread(), lock);
-
- VM_thread * vm_thread = get_thread_ptr();
- tmn_suspend_disable(); //---------------------------------v
-
- ManagedObject *p_obj = (ManagedObject *)(((ObjectHandle)lock)->object);
- uint16 stack_key = STACK_KEY(p_obj);
-
- tmn_suspend_enable(); //---------------------------------^
-
- return (jboolean)((vm_thread -> thread_index == stack_key) ? JNI_TRUE : JNI_FALSE);
+ return false;//jthread_holds_lock(jthread_self(), monitor);
}
/*
* Class: java_lang_VMThreadManager
* Method: interrupt
- * Signature: (Ljava/lang/Thread;)V
+ * Signature: (Ljava/lang/Thread;)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_interrupt
- (JNIEnv * UNREF jenv, jclass, jobject jthread)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_interrupt
+ (JNIEnv * UNREF jenv, jclass clazz, jobject jthread)
{
- thread_interrupt(jthread);
+ return jthread_interrupt(jthread);
}
/*
@@ -78,10 +65,9 @@
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_java_lang_VMThreadManager_isInterrupted__
- (JNIEnv * UNREF jenv, jclass)
+ (JNIEnv * UNREF jenv, jclass clazz)
{
- jobject thread = thread_current_thread();
- return thread_is_interrupted(thread, JNI_TRUE);
+ return jthread_is_interrupted(jthread_self());
}
/*
@@ -90,198 +76,193 @@
* Signature: (Ljava/lang/Thread;)Z
*/
JNIEXPORT jboolean JNICALL Java_java_lang_VMThreadManager_isInterrupted__Ljava_lang_Thread_2
- (JNIEnv * UNREF jenv, jclass, jobject jthread)
+ (JNIEnv * UNREF jenv, jclass clazz, jobject thread)
{
- return thread_is_interrupted(jthread, JNI_FALSE);
+ return jthread_is_interrupted(thread);
}
/*
* Class: java_lang_VMThreadManager
* Method: notify
- * Signature: (Ljava/lang/Object;)V
+ * Signature: (Ljava/lang/Object;)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_notify
- (JNIEnv * UNREF jenv, jclass, jobject obj)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_notify
+ (JNIEnv * UNREF jenv, jclass clazz, jobject monitor)
{
- thread_object_notify(obj);
+ return jthread_monitor_notify(monitor);
}
/*
* Class: java_lang_VMThreadManager
* Method: notifyAll
- * Signature: (Ljava/lang/Object;)V
+ * Signature: (Ljava/lang/Object;)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_notifyAll
- (JNIEnv * UNREF jenv, jclass, jobject obj)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_notifyAll
+ (JNIEnv * UNREF jenv, jclass clazz, jobject monitor)
{
- thread_object_notify_all(obj);
+ return jthread_monitor_notify_all(monitor);
}
/*
* Class: java_lang_VMThreadManager
* Method: resume
- * Signature: (Ljava/lang/Thread;)V
+ * Signature: (Ljava/lang/Thread;)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_resume
- (JNIEnv * UNREF jenv, jclass, jobject jthread)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_resume
+ (JNIEnv * UNREF jenv, jclass clazz, jobject thread)
{
- thread_resume(jthread);
+ return jthread_resume(thread);
}
/*
* Class: java_lang_VMThreadManager
* Method: setPriority
- * Signature: (Ljava/lang/Thread;I)V
+ * Signature: (Ljava/lang/Thread;I)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_setPriority
- (JNIEnv * UNREF jenv, jclass, jobject UNREF jthread, jint UNREF priority)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_setPriority
+ (JNIEnv * UNREF jenv, jclass clazz, jobject UNREF thread, jint UNREF priority)
{
- //ToDo: the following code will be used.
- //thread_set_priority(jthread, priority);
+ return jthread_set_priority(thread, priority);
}
/*
* Class: java_lang_VMThreadManager
* Method: sleep
+ * Signature: (JI)I
+ */
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_sleep
+ (JNIEnv * UNREF jenv, jclass clazz, jlong millis, jint nanos)
+{
+ return jthread_sleep(millis, nanos);
+}
+
+/*
+ * Class: java_lang_VMThreadManager
+ * Method: init
* Signature: (JI)V
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_sleep
- (JNIEnv * UNREF jenv, jclass, jlong millis, jint nanos)
+JNIEXPORT jlong JNICALL Java_java_lang_VMThreadManager_init
+ (JNIEnv *jenv, jclass clazz, jobject thread, jobject ref, jlong oldThread)
{
-#if defined (__INTEL_COMPILER) // intel compiler
- #pragma warning( push )
- #pragma warning (disable:1682) // explicit conversion of a 64-bit integral type to a smaller integral type
-#elif defined (_MSC_VER) // MS compiler
- #pragma warning( push )
- #pragma warning (disable:4244) // conversion from 'jlong' to 'long', possible loss of data
-#endif
-
- thread_sleep(thread_current_thread(), millis, nanos);
-
-#if defined (__INTEL_COMPILER) || defined (_MSC_VER)
- #pragma warning( pop )
-#endif
+ return jthread_thread_init(NULL, jenv, thread, ref, oldThread);
}
/*
* Class: java_lang_VMThreadManager
* Method: start
- * Signature: (Ljava/lang/Thread;J)V
+ * Signature: (Ljava/lang/Thread;JZI)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_start
- (JNIEnv *jenv, jclass, jobject thread, jlong UNREF stackSize)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_start
+ (JNIEnv *jenv, jclass clazz, jobject thread, jlong stackSize, jboolean daemon, jint priority)
{
- thread_start(jenv, thread);
+ jthread_threadattr_t attrs;
+ attrs.daemon = daemon;
+ attrs.priority = priority;
+ attrs.stacksize = (jint)stackSize;
+ return (jint)jthread_create(jenv, thread, &attrs);
}
/*
* Class: java_lang_VMThreadManager
* Method: stop
- * Signature: (Ljava/lang/Thread;Ljava/lang/Throwable;)V
+ * Signature: (Ljava/lang/Thread;Ljava/lang/Throwable;)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_stop
- (JNIEnv *, jclass, jobject UNREF thread, jthrowable UNREF threadDeathException)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_stop
+ (JNIEnv *env, jclass clazz, jobject UNREF thread, jthrowable UNREF threadDeathException)
{
- //ToDo: the following code will be used.
- //thread_stop(thread, threadDeathException);
+ return jthread_exception_stop(thread, threadDeathException);
}
/*
* Class: java_lang_VMThreadManager
* Method: suspend
- * Signature: (Ljava/lang/Thread;)V
+ * Signature: (Ljava/lang/Thread;)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_suspend
- (JNIEnv * UNREF jenv, jclass, jobject jthread)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_suspend
+ (JNIEnv * UNREF jenv, jclass clazz, jobject jthread)
{
- thread_suspend(jthread);
+ return jthread_suspend(jthread);
}
/*
* Class: java_lang_VMThreadManager
* Method: wait
- * Signature: (Ljava/lang/Object;JI)V
+ * Signature: (Ljava/lang/Object;JI)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_wait
- (JNIEnv *, jclass, jobject object, jlong millis, jint nanos)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_wait
+ (JNIEnv *env, jclass clazz, jobject monitor, jlong millis, jint UNREF nanos)
{
- thread_object_wait_nanos (object, millis, nanos);
+ return jthread_monitor_timed_wait(monitor, millis, nanos);
}
/*
* Class: java_lang_VMThreadManager
* Method: yield
- * Signature: ()V
+ * Signature: ()I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_yield
- (JNIEnv * UNREF jenv, jclass)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_yield
+ (JNIEnv * UNREF jenv, jclass clazz)
{
- //ToDo: the following code will be used.
- //thread_yield(thread_current_thread());
+ return jthread_yield();
+}
- SleepEx(0, false);
+/*
+ * Class: java_lang_VMThreadManager
+ * Method: attach
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_attach
+ (JNIEnv * UNREF jenv, jclass clazz, jobject java_thread)
+{
+ jthread_attach(jenv, java_thread);
}
/*
* Class: java_lang_VMThreadManager
- * Method: isDead
+ * Method: isAlive
* Signature: (Ljava/lang/Thread;)Z
*/
-JNIEXPORT jboolean JNICALL Java_java_lang_VMThreadManager_isDead
- (JNIEnv *jenv, jclass, jobject thread)
+JNIEXPORT jboolean JNICALL Java_java_lang_VMThreadManager_isAlive
+ (JNIEnv *jenv, jclass clazz, jobject thread)
{
- //return ! thread_is_alive(thread);
+ hythread_t tm_native_thread;
- VM_thread *p_vmthread = get_vm_thread_ptr_safe(jenv, thread);
- if ( !p_vmthread ) {
- return 1; // don't try to isAlive() non-existant thread
- }
-
- java_state as = p_vmthread->app_status;
- // According to JAVA spec, this method should return true, if and
- // only if the thread has been died.
- switch (as) {
- case thread_is_sleeping:
- case thread_is_waiting:
- case thread_is_timed_waiting:
- case thread_is_blocked:
- case thread_is_running:
- case thread_is_birthing:
- return 0;
- //break;
- case thread_is_dying:
- case zip:
- return 1;
- //break;
- default:
- ABORT("Unexpected thread state");
- return 1;
- //break;
+ tm_native_thread = (hythread_t )vm_jthread_get_tm_data((jthread)thread);
+ assert(tm_native_thread);
+ if (hythread_is_alive(tm_native_thread))
+ {
+ printf("isAlive\n");
+ return true;
}
- // must return from inside the switch statement //remark #111: statement is unreachable
+ printf ("isnot\n");
+ return false;
}
/*
* Class: java_lang_VMThreadManager
* Method: join
- * Signature: (Ljava/lang/Thread;JI)V
+ * Signature: (Ljava/lang/Thread;JI)I
*/
-JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_join
- (JNIEnv * UNREF jenv, jclass, jobject thread, jlong millis, jint nanos)
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_join
+ (JNIEnv * UNREF jenv, jclass clazz, jobject thread, jlong millis, jint nanos)
{
-#if defined (__INTEL_COMPILER) // intel compiler
- #pragma warning( push )
- #pragma warning (disable:1682) // explicit conversion of a 64-bit integral type to a smaller integral type
-#elif defined (_MSC_VER) // MS compiler
- #pragma warning( push )
- #pragma warning (disable:4244) // conversion from 'jlong' to 'long', possible loss of data
-#endif
-
- thread_join(thread, millis, nanos);
-
-#if defined (__INTEL_COMPILER) || defined (_MSC_VER)
-#pragma warning( pop )
-#endif
+ return jthread_timed_join(thread, millis, nanos);
}
+
+
+/*
+ * Class: java_lang_VMThreadManager
+ * Method: yield
+ * Signature: ()I
+ */
+
+/*
+ * ????
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_initVMThreadManager
+ (JNIEnv * UNREF jenv, jclass clazz)
+{
+ return hythread_init();
+}
+*/
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.h?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMThreadManager.h Wed Aug 23 09:48:41 2006
@@ -13,11 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-/**
+/**
* @author Andrey Chernyshev
- * @version $Revision: 1.1.2.1.4.5 $
- */
+ * @version $Revision: 1.1.2.1.2.2 $
+ */
/*
* THE FILE HAS BEEN AUTOGENERATED BY INTEL IJH TOOL.
@@ -26,150 +25,132 @@
*/
#include <jni.h>
-
-
/* Header for class java.lang.VMThreadManager */
#ifndef _JAVA_LANG_VMTHREADMANAGER_H
#define _JAVA_LANG_VMTHREADMANAGER_H
-
#ifdef __cplusplus
extern "C" {
#endif
-
/* Native methods */
/*
- * Method: java.lang.VMThreadManager.countStackFrames(Ljava/lang/Thread;)I
- */
-JNIEXPORT jint JNICALL
-Java_java_lang_VMThreadManager_countStackFrames(JNIEnv *, jclass,
- jobject);
-
-/*
* Method: java.lang.VMThreadManager.currentThread()Ljava/lang/Thread;
*/
-JNIEXPORT jobject JNICALL
-Java_java_lang_VMThreadManager_currentThread(JNIEnv *, jclass);
+JNIEXPORT jobject JNICALL Java_java_lang_VMThreadManager_currentThread
+ (JNIEnv *, jclass);
/*
* Method: java.lang.VMThreadManager.holdsLock(Ljava/lang/Object;)Z
*/
-JNIEXPORT jboolean JNICALL
-Java_java_lang_VMThreadManager_holdsLock(JNIEnv *, jclass,
- jobject);
+JNIEXPORT jboolean JNICALL Java_java_lang_VMThreadManager_holdsLock
+ (JNIEnv *, jclass, jobject);
/*
- * Method: java.lang.VMThreadManager.interrupt(Ljava/lang/Thread;)V
+ * Method: java.lang.VMThreadManager.interrupt(Ljava/lang/Thread;)I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_interrupt(JNIEnv *, jclass,
- jobject);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_interrupt
+ (JNIEnv *, jclass, jobject);
/*
- * Method: java.lang.VMThreadManager.isDead(Ljava/lang/Thread;)Z
+ * Method: java.lang.VMThreadManager.isInterrupted()Z
*/
-JNIEXPORT jboolean JNICALL
-Java_java_lang_VMThreadManager_isDead(JNIEnv *, jclass,
- jobject);
+JNIEXPORT jboolean JNICALL Java_java_lang_VMThreadManager_isInterrupted__
+ (JNIEnv *, jclass);
/*
- * Method: java.lang.VMThreadManager.isInterrupted()Z
+ * Method: java.lang.VMThreadManager.isInterrupted(Ljava/lang/Thread;)Z
*/
-JNIEXPORT jboolean JNICALL
-Java_java_lang_VMThreadManager_isInterrupted__(JNIEnv *, jclass);
+JNIEXPORT jboolean JNICALL Java_java_lang_VMThreadManager_isInterrupted__Ljava_lang_Thread_2
+ (JNIEnv *, jclass, jobject);
/*
- * Method: java.lang.VMThreadManager.isInterrupted(Ljava/lang/Thread;)Z
+ * Method: java.lang.VMThreadManager.notify(Ljava/lang/Object;)I
*/
-JNIEXPORT jboolean JNICALL
-Java_java_lang_VMThreadManager_isInterrupted__Ljava_lang_Thread_2(JNIEnv *, jclass,
- jobject);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_notify
+ (JNIEnv *, jclass, jobject);
/*
- * Method: java.lang.VMThreadManager.join(Ljava/lang/Thread;JI)V
- * Throws: java.lang.InterruptedException
+ * Method: java.lang.VMThreadManager.notifyAll(Ljava/lang/Object;)I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_join(JNIEnv *, jclass,
- jobject, jlong, jint);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_notifyAll
+ (JNIEnv *, jclass, jobject);
/*
- * Method: java.lang.VMThreadManager.notify(Ljava/lang/Object;)V
+ * Method: java.lang.VMThreadManager.resume(Ljava/lang/Thread;)I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_notify(JNIEnv *, jclass,
- jobject);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_resume
+ (JNIEnv *, jclass, jobject);
/*
- * Method: java.lang.VMThreadManager.notifyAll(Ljava/lang/Object;)V
+ * Method: java.lang.VMThreadManager.setPriority(Ljava/lang/Thread;I)I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_notifyAll(JNIEnv *, jclass,
- jobject);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_setPriority
+ (JNIEnv *, jclass, jobject, jint);
/*
- * Method: java.lang.VMThreadManager.resume(Ljava/lang/Thread;)V
+ * Method: java.lang.VMThreadManager.sleep(JI)I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_resume(JNIEnv *, jclass,
- jobject);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_sleep
+ (JNIEnv *, jclass, jlong, jint);
/*
- * Method: java.lang.VMThreadManager.setPriority(Ljava/lang/Thread;I)V
+ * Method: java.lang.VMThreadManager.start(Ljava/lang/Thread;JZI)I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_setPriority(JNIEnv *, jclass,
- jobject, jint);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_start
+ (JNIEnv *, jclass, jobject, jlong, jboolean, jint);
/*
- * Method: java.lang.VMThreadManager.sleep(JI)V
- * Throws: java.lang.InterruptedException
+ * Method: java.lang.VMThreadManager.stop(Ljava/lang/Thread;Ljava/lang/Throwable;)I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_sleep(JNIEnv *, jclass,
- jlong, jint);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_stop
+ (JNIEnv *, jclass, jobject, jthrowable);
/*
- * Method: java.lang.VMThreadManager.start(Ljava/lang/Thread;J)V
+ * Method: java.lang.VMThreadManager.suspend(Ljava/lang/Thread;)I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_start(JNIEnv *, jclass,
- jobject, jlong);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_suspend
+ (JNIEnv *, jclass, jobject);
/*
- * Method: java.lang.VMThreadManager.stop(Ljava/lang/Thread;Ljava/lang/Throwable;)V
+ * Method: java.lang.VMThreadManager.wait(Ljava/lang/Object;JI)I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_stop(JNIEnv *, jclass,
- jobject, jthrowable);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_wait
+ (JNIEnv *, jclass, jobject, jlong, jint);
/*
- * Method: java.lang.VMThreadManager.suspend(Ljava/lang/Thread;)V
+ * Method: java.lang.VMThreadManager.yield()I
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_suspend(JNIEnv *, jclass,
- jobject);
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_yield
+ (JNIEnv *, jclass);
/*
- * Method: java.lang.VMThreadManager.wait(Ljava/lang/Object;JI)V
- * Throws: java.lang.InterruptedException
+ * Method: java.lang.VMThreadManager.attach()V
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_wait(JNIEnv *, jclass,
- jobject, jlong, jint);
+JNIEXPORT void JNICALL Java_java_lang_VMThreadManager_attach
+ (JNIEnv *, jclass, jobject);
+
/*
- * Method: java.lang.VMThreadManager.yield()V
+ * Method: java.lang.VMThreadManager.isDead(Ljava/lang/Thread;)Z
*/
-JNIEXPORT void JNICALL
-Java_java_lang_VMThreadManager_yield(JNIEnv *, jclass);
+JNIEXPORT jboolean JNICALL Java_java_lang_VMThreadManager_isAlive
+ (JNIEnv *, jclass, jobject);
+/*
+ * Method: java.lang.VMThreadManager.join(Ljava/lang/Thread;JI)I
+ * Throws: java.lang.InterruptedException
+ */
+JNIEXPORT jint JNICALL Java_java_lang_VMThreadManager_join
+ (JNIEnv *, jclass, jobject, jlong, jint);
+/*
+ * Method: java.lang.VMThreadManager.init(Ljava/lang/Thread;)V
+ */
+JNIEXPORT jlong JNICALL Java_java_lang_VMThreadManager_init
+ (JNIEnv *, jclass, jobject, jobject, jlong);
#ifdef __cplusplus
}
#endif
-
-#endif /* _JAVA_LANG_VMTHREADMANAGER_H */
-
+#endif
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_util_concurrent_locks_LockSupport.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_util_concurrent_locks_LockSupport.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_util_concurrent_locks_LockSupport.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_util_concurrent_locks_LockSupport.cpp Wed Aug 23 09:48:41 2006
@@ -21,22 +21,21 @@
#include "thread_generic.h"
#include "java_util_concurrent_locks_LockSupport.h"
#include "jni.h"
-
+#include "open/jthread.h"
/* Inaccessible static: parked */
/*
* Method: java.util.concurrent.locks.LockSupport.unpark(Ljava/lang/Thread;)V
*/
JNIEXPORT void JNICALL Java_java_util_concurrent_locks_LockSupport_unpark (JNIEnv *jenv, jclass, jobject thread) {
- if (!thread) return;
- unpark(get_vm_thread_ptr_safe(jenv, thread));
+ jthread_unpark(thread);
}
/*
* Method: java.util.concurrent.locks.LockSupport.park()V
*/
JNIEXPORT void JNICALL Java_java_util_concurrent_locks_LockSupport_park (JNIEnv * UNREF jenv, jclass) {
- park();
+ jthread_park();
}
/*
@@ -49,7 +48,7 @@
#endif
JNIEXPORT void JNICALL Java_java_util_concurrent_locks_LockSupport_parkNanos(JNIEnv * UNREF jenv, jclass, jlong nanos) {
- parktimed(nanos/((jlong)1000000), (jint)(nanos%((jlong)1000000)));
+ jthread_timed_park(0,(jint)nanos);
}
#if defined (__INTEL_COMPILER)
@@ -60,6 +59,7 @@
* Method: java.util.concurrent.locks.LockSupport.parkUntil(J)V
*/
JNIEXPORT void JNICALL Java_java_util_concurrent_locks_LockSupport_parkUntil(JNIEnv * UNREF jenv, jclass UNREF thread, jlong milis) {
- parkuntil(milis, 0);
+ //FIXME integration should be parkUntil
+ jthread_timed_park((jlong)milis, 0);
}
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_vm_VMStack.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_vm_VMStack.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_vm_VMStack.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_vm_VMStack.cpp Wed Aug 23 09:48:41 2006
@@ -29,7 +29,6 @@
#define LOG_DOMAIN "kernel.stack"
#include "cxxlog.h"
-#include "open/thread.h"
#include "stack_trace.h"
#include "jni_direct.h"
#include "jni_utils.h"
@@ -61,7 +60,7 @@
if (!res) return NULL;
// obtain and return class of the frame
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
return struct_Class_to_jclass((Class*)method_get_class(frame.method));
}
@@ -128,7 +127,7 @@
unsigned maxSize = signedMaxSize;
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
unsigned size;
StackTraceFrame* frames;
st_get_trace(&size, &frames);
@@ -152,7 +151,7 @@
length ++;
}
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
jclass ste = struct_Class_to_java_lang_Class_Handle(VM_Global_State::loader_env->JavaLangClass_Class);
assert(ste);
@@ -162,7 +161,7 @@
if (arr == NULL) {
// OutOfMemoryError
core_free(frames);
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
return NULL;
}
@@ -183,7 +182,7 @@
}
core_free(frames);
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
return arr;
}
@@ -282,16 +281,18 @@
}
}
}
+ // skip Thread.runImpl()
+ size--;
// skip the VMStart$MainThread if one exits from the bottom of the stack
// along with 2 reflection frames used to invoke method main
static String* starter_String = genv->string_pool.lookup("java/lang/VMStart$MainThread");
- Method_Handle method = frames[size-1].method;
+ Method_Handle method = frames[size].method;
assert(method);
// skip only for main application thread
- if (!strcmp(method_get_name(method), "run")
+ if (!strcmp(method_get_name(method), "runImpl")
&& method->get_class()->name == starter_String) {
- int rem = size - skip;
+ int rem = size - skip-1;
size -= rem < 3 ? rem : 3;
}
@@ -299,7 +300,7 @@
<< " frames but there are only "
<< size << " frames in stack");
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
jclass ste = struct_Class_to_java_lang_Class_Handle(genv->java_lang_StackTraceElement_Class);
assert(ste);
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/object_handles.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/object_handles.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/object_handles.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/object_handles.cpp Wed Aug 23 09:48:41 2006
@@ -32,7 +32,7 @@
#include "object_handles.h"
#include "vm_stats.h"
#include "vm_threads.h"
-#include "open/thread.h"
+
#include "thread_manager.h"
#include "open/types.h"
#include "open/vm_util.h"
@@ -66,7 +66,7 @@
GcFrame::GcFrame(unsigned size_hint)
{
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
if (size_hint>0)
nodes = gc_frame_node_new(size_hint);
@@ -78,7 +78,7 @@
GcFrame::~GcFrame()
{
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
assert(p_TLS_vmthread->gc_frames==this);
p_TLS_vmthread->gc_frames = next;
@@ -97,7 +97,7 @@
assert(p);
assert(NULL == *p || (*p >= vm_heap_base_address()
&& *p < vm_heap_ceiling_address()));
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
ensure_capacity();
nodes->elements[nodes->obj_size+nodes->mp_size] = nodes->elements[nodes->obj_size];
@@ -107,7 +107,7 @@
void GcFrame::add_managed_pointer(ManagedPointer* p)
{
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
ensure_capacity();
nodes->elements[nodes->obj_size+nodes->mp_size] = (void**)p;
@@ -156,13 +156,13 @@
bool
managed_object_is_java_lang_class(ManagedObject* p_obj) {
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
return managed_object_is_java_lang_class_unsafe(p_obj);
}
bool
object_is_java_lang_class(ObjectHandle oh) {
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
tmn_suspend_disable();
bool res = managed_object_is_java_lang_class_unsafe(oh->object);
tmn_suspend_enable();
@@ -178,13 +178,13 @@
bool
managed_object_is_valid(ManagedObject* p_obj) {
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
return managed_object_object_is_valid_unsafe(p_obj);
}
bool
object_is_valid(ObjectHandle oh) {
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
tmn_suspend_disable();
bool res = managed_object_object_is_valid_unsafe(oh->object);
tmn_suspend_enable();
@@ -199,25 +199,22 @@
ObjectHandle oh_allocate_global_handle()
{
- assert(tmn_is_suspend_enabled());
// Allocate and init handle
ObjectHandlesOld* h = oh_allocate_object_handle(); //(ObjectHandlesOld*)m_malloc(sizeof(ObjectHandlesOld));
h->handle.object = NULL;
h->allocated_on_the_stack = false;
- tm_acquire_tm_lock();
-
tmn_suspend_disable(); // ----------------vvv
+ p_handle_lock->_lock();
// Insert at beginning of globals list
h->prev = NULL;
h->next = global_object_handles;
global_object_handles = h;
if(h->next)
h->next->prev = h;
+ p_handle_lock->_unlock();
tmn_suspend_enable(); //--------------------------------------------^^^
- tm_release_tm_lock();
-
return &h->handle;
} //vm_create_global_object_handle
@@ -230,10 +227,8 @@
void oh_deallocate_global_handle(ObjectHandle handle)
{
- assert(tmn_is_suspend_enabled());
-
- tm_acquire_tm_lock();
tmn_suspend_disable(); // ----------vvv
+ p_handle_lock->_lock();
assert(is_global_handle(handle));
handle->object = NULL;
@@ -242,9 +237,8 @@
if (h->prev) h->prev->next = h->next;
if (h==global_object_handles) global_object_handles = h->next;
+ p_handle_lock->_unlock();
tmn_suspend_enable(); // -------------------------------------^^^
- tm_release_tm_lock();
-
STD_FREE(h);
} //vm_delete_global_object_handle
@@ -289,7 +283,7 @@
{
// the function should be called only from suspend disabled mode
// as it is not gc safe.
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
ObjectHandlesNew* cur = (ObjectHandlesNew*)*hs;
if (!cur || cur->size>=cur->capacity)
cur = oh_add_new_handles((ObjectHandlesNew**)hs);
@@ -356,9 +350,9 @@
VMEXPORT // temporary solution for interpreter unplug
ObjectHandle oh_allocate_local_handle()
{
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
// FIXME: it looks like this should be uncoment or suspend_disable added
- //assert(!tmn_is_suspend_enabled());
+ //assert(!hythread_is_suspend_enabled());
// ? 20021202 There are really 3 cases to check:
@@ -385,7 +379,7 @@
}
ObjectHandle oh_convert_to_local_handle(ManagedObject* pointer) {
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
ObjectHandle jobj = oh_allocate_local_handle();
TRACE2("oh", "oh_convert_to_local_handle() pointer = " << pointer << ", handle = " << jobj);
jobj->object = pointer;
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/vm_arrays.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/vm_arrays.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/vm_arrays.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/object/vm_arrays.cpp Wed Aug 23 09:48:41 2006
@@ -33,7 +33,7 @@
#include "vm_arrays.h"
#include "vm_synch.h"
#include "open/vm_util.h"
-#include "open/thread.h"
+
#include "vm_stats.h"
@@ -78,7 +78,7 @@
#ifdef VM_STATS
vm_stats_total.num_anewarray++;
#endif
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
assert(!arr_clss->is_array_of_primitives);
if (length < 0) {
@@ -128,7 +128,7 @@
VMEXPORT // temporary solution for interpreter unplug
Vector_Handle vm_new_vector_primitive(Class *vector_class, int length) {
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
// VM does not support arrays of length >= MAXINT>>2
if (length & TWO_HIGHEST_BITS_SET_MASK) {
tmn_suspend_enable();
@@ -202,7 +202,7 @@
Vector_Handle vm_new_vector_using_vtable_and_thread_pointer(Allocation_Handle vector_handle, int length, void *tp)
{
- assert( ! tmn_is_suspend_enabled());
+ assert( ! hythread_is_suspend_enabled());
// VM does not support arrays of length >= MAXINT>>2
if (length & TWO_HIGHEST_BITS_SET_MASK) {
tmn_suspend_enable();
@@ -222,9 +222,9 @@
vector_vtable->clss->num_allocations++;
vector_vtable->clss->num_bytes_allocated += sz;
#endif //VM_STATS
- assert( ! tmn_is_suspend_enabled());
+ assert( ! hythread_is_suspend_enabled());
Vector_Handle vector = (Vector_Handle)gc_alloc(sz, vector_handle, tp);
- assert( ! tmn_is_suspend_enabled());
+ assert( ! hythread_is_suspend_enabled());
if (NULL == vector) {
exn_throw(
@@ -275,7 +275,7 @@
int *dims_array,
unsigned dims)
{
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
Global_Env *global_env = VM_Global_State::loader_env;
int length = *dims_array;
assert(length >= 0);
@@ -289,7 +289,7 @@
// Allocate an array of arrays.
volatile Vector_Handle object_array =
(Vector_Handle) vm_new_vector(c, length);
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
// Alexei
// Since this function is called from a managed code
// generated by JIT and this is a native code,
@@ -353,7 +353,7 @@
#ifdef VM_STATS
vm_stats_total.num_multianewarray++;
#endif
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
const unsigned max_dims = 100;
int dims_array[max_dims];
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/reflection/reflection.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/reflection/reflection.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/reflection/reflection.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/reflection/reflection.cpp Wed Aug 23 09:48:41 2006
@@ -29,7 +29,7 @@
#include "vm_strings.h"
#include "reflection.h"
#include "port_malloc.h"
-#include "open/thread.h"
+
#include "exceptions.h"
#include "heap.h"
#include "primitives_support.h"
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/stack/stack_trace.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/stack/stack_trace.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/stack/stack_trace.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/stack/stack_trace.cpp Wed Aug 23 09:48:41 2006
@@ -24,7 +24,7 @@
#include "stack_trace.h"
#include "interpreter.h"
#include "jit_intf_cpp.h"
-#include "open/thread.h"
+
#include "method_lookup.h"
Method_Handle get_method(StackIterator* si)
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/atomics.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/atomics.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/atomics.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/atomics.cpp Wed Aug 23 09:48:41 2006
@@ -27,7 +27,7 @@
#include "atomics.h"
#include "vm_arrays.h"
#include "port_atomic.h"
-#include "open/thread.h"
+
/*
* Common atomic functions.
@@ -79,7 +79,7 @@
(JNIEnv * env, jobject UNREF accesor, jobject obj, jlong offset, jobject expected, jobject value)
{
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
ObjectHandle h = (ObjectHandle)obj;
ObjectHandle v = (ObjectHandle)value;
@@ -117,7 +117,7 @@
JNIEXPORT jboolean compareAndSetBooleanField
(JNIEnv * env, jobject UNREF accesor, jobject obj, jlong offset, jboolean expected, jboolean value)
{
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
ObjectHandle h = (ObjectHandle)obj;
tmn_suspend_disable();
@@ -136,7 +136,7 @@
(JNIEnv * env, jobject UNREF accesor, jobject obj, jlong offset, jint expected, jint value)
{
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
ObjectHandle h = (ObjectHandle)obj;
tmn_suspend_disable();
@@ -154,7 +154,7 @@
JNIEXPORT jboolean compareAndSetLongField
(JNIEnv * env, jobject UNREF accesor, jobject obj, jlong offset, jlong expected, jlong value)
{
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
ObjectHandle h = (ObjectHandle)obj;
tmn_suspend_disable();
@@ -173,7 +173,7 @@
JNIEXPORT jboolean compareAndSetObjectArray
(JNIEnv * UNREF env, jobject UNREF self, jobjectArray array, jint index, jobject expected, jobject value)
{
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
tmn_suspend_disable();
@@ -209,7 +209,7 @@
JNIEXPORT jboolean compareAndSetBooleanArray
(JNIEnv * UNREF env, jobject UNREF self, jbooleanArray array, jint index, jboolean expected, jboolean value)
{
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
tmn_suspend_disable();
@@ -228,7 +228,7 @@
JNIEXPORT jboolean compareAndSetIntArray
(JNIEnv * UNREF env, jobject UNREF self, jintArray array, jint index, jint expected, jint value)
{
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
tmn_suspend_disable();
@@ -247,7 +247,7 @@
JNIEXPORT jboolean compareAndSetLongArray
(JNIEnv * UNREF env, jobject UNREF self, jlongArray array, jint index, jlong expected, jlong value)
{
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
tmn_suspend_disable();
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythr.def
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythr.def?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythr.def (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythr.def Wed Aug 23 09:48:41 2006
@@ -1,22 +0,0 @@
-LIBRARY HYTHR
-
-EXPORTS
- hythread_attach
- hythread_create
- hythread_detach
- hythread_exit
- hythread_global
- hythread_monitor_destroy
- hythread_monitor_enter
- hythread_monitor_exit
- hythread_monitor_init_with_name
- hythread_monitor_notify
- hythread_monitor_notify_all
- hythread_monitor_try_enter
- hythread_monitor_wait
- hythread_self
- hythread_tls_alloc
- hythread_tls_free
- hythread_tls_get
- hythread_tls_set
-
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythr.exp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythr.exp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythr.exp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythr.exp Wed Aug 23 09:48:41 2006
@@ -1,22 +0,0 @@
-HYTHR_0.1 {
- global :
- hythread_attach;
- hythread_create;
- hythread_detach;
- hythread_exit;
- hythread_global;
- hythread_monitor_destroy;
- hythread_monitor_enter;
- hythread_monitor_exit;
- hythread_monitor_init_with_name;
- hythread_monitor_notify;
- hythread_monitor_notify_all;
- hythread_monitor_try_enter;
- hythread_monitor_wait;
- hythread_self;
- hythread_tls_alloc;
- hythread_tls_free;
- hythread_tls_get;
- hythread_tls_set;
- local : *;
-};
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythreads.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythreads.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythreads.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythreads.cpp Wed Aug 23 09:48:41 2006
@@ -1,290 +0,0 @@
-/*
- * 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.
- */
-/**
- * @author Artem Aliev
- * @version $Revision: 1.1.2.1.4.5 $
- */
-#include "hythreads.h"
-#include "log_macro.h"
-
-
-#ifdef WIN32
-#include <windows.h>
-#endif
-
-#define GLOBAL_MONITOR_NAME "global_monitor"
-
-#define RET_ON_ERROR(stat) if(stat) { return -1; }
-
-extern "C"
-{
-
-JNIEXPORT void __cdecl hythread_init(void* lib);
-
-#ifdef WIN32
-BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpres) {
- if (dwReason == DLL_PROCESS_ATTACH) {
- hythread_init (NULL);
- }
- return TRUE;
-}
-#else
-void __cdecl hythread_library_init(void) {
- hythread_init(NULL);
-
-}
-#endif
-
-
-hythread_monitor_t p_global_monitor;
-// Will do all initilalization of thread library.
-// init global_monitor now.
-JNIEXPORT void __cdecl hythread_init (void* lib) {
- apr_initialize();
- hythread_monitor_init_with_name(&p_global_monitor, 0, "Thread Global Monitor");
- hythread_monitor_t *mon = (hythread_monitor_t*)hythread_global(GLOBAL_MONITOR_NAME);
- *mon = p_global_monitor;
-}
-
-
-
-// ========================== MONITOR impl ================================================
-
-static apr_pool_t* get_pool() {
- apr_pool_t *pool;
- apr_pool_create(&pool, 0);
- return pool;
-}
-
-JNIEXPORT int __cdecl hythread_monitor_init_with_name (hythread_monitor_t* handle, unsigned flags, char* name) {
- apr_status_t stat;
-
- apr_pool_t *pool;
- apr_pool_create(&pool, 0);
- *handle = (hythread_monitor_t) apr_palloc(pool, sizeof(struct hymonitor));
- if(*handle == NULL) {
- return -1;
- }
- stat = apr_thread_mutex_create(&((*handle)->mutex), APR_THREAD_MUTEX_NESTED, pool);
- RET_ON_ERROR(stat)
- stat = apr_thread_cond_create(&((*handle)->cond), pool);
- RET_ON_ERROR(stat)
- (*handle)->name = name;
- return 0;
-}
-
-JNIEXPORT int __cdecl
-hythread_monitor_destroy (hythread_monitor_t monitor){
- apr_status_t stat;
- apr_pool_t *pool = apr_thread_mutex_pool_get (monitor->mutex);
- if(pool == NULL) {
- return -1;
- }
- stat = apr_thread_mutex_destroy(monitor->mutex);
- RET_ON_ERROR(stat)
- stat = apr_thread_cond_destroy(monitor->cond);
- RET_ON_ERROR(stat)
- apr_pool_destroy(pool);
- return 0;
-}
-
-JNIEXPORT int __cdecl
-hythread_monitor_try_enter (hythread_monitor_t monitor){
-// TODO implement
- return -1;
-}
-JNIEXPORT int __cdecl
-hythread_monitor_enter (hythread_monitor_t monitor){
- apr_status_t stat = apr_thread_mutex_lock(monitor->mutex);
- RET_ON_ERROR(stat)
- return 0;
-}
-JNIEXPORT int __cdecl
-hythread_monitor_exit (hythread_monitor_t monitor) {
- apr_status_t stat = apr_thread_mutex_unlock(monitor->mutex);
- RET_ON_ERROR(stat)
- return 0;
-}
-JNIEXPORT int __cdecl
-hythread_monitor_notify(hythread_monitor_t monitor){
- apr_status_t stat = apr_thread_cond_signal(monitor->cond);
- RET_ON_ERROR(stat)
- return 0;
-}
-JNIEXPORT int __cdecl
-hythread_monitor_notify_all (hythread_monitor_t monitor){
- apr_status_t stat = apr_thread_cond_broadcast(monitor->cond);
- RET_ON_ERROR(stat)
- return 0;
-}
-JNIEXPORT int __cdecl
-hythread_monitor_wait (hythread_monitor_t monitor){
- apr_status_t stat = apr_thread_cond_wait(monitor->cond, monitor->mutex);
- RET_ON_ERROR(stat)
- return 0;
-}
-
-// ======================= ATTACH ======================================
-
-JNIEXPORT int __cdecl
-hythread_attach (hythread_t* handle){
- if(handle) {
- *handle=hythread_self();
- }
- return 0;
-}
-JNIEXPORT void __cdecl
-hythread_detach (hythread_t handle){}
-JNIEXPORT hythread_t __cdecl hythread_self() {
- return apr_os_thread_current();
-}
-
-// very simple Map implementation
-// current scenario use only one global so it works well
-// need to be hashtable in the future
-// TODO use hashtable
-
-#define TABLE_SIZE 256
-char *names [TABLE_SIZE];
-unsigned data [TABLE_SIZE];
-int size = 0;
-// return index in array if found, -1 otherwise
-int find_entry (char* name) {
- // quick pass
- int i;
- for (i = 0; i < size; i++) {
- if (names[i] == name) {
- return i;
- }
- }
- // strcmp pass.
- for (i = 0; i < size; i++) {
- if (strcmp(names[i], name) == 0) {
- return i;
- }
- }
- return -1;
-}
-//add entry to the end of the array
-// retrun new entry index, -1 if failed.
-int add_entry(char* name) {
- int index = size++;
- if(index >= TABLE_SIZE-1) {
- return -1;
- }
- names[index] = name;
- data[index] = 0;
- return index;
-}
-
-JNIEXPORT unsigned* __cdecl
-hythread_global (char* name) {
- //hythread_monitor_enter(*p_global_monitor);
- int index = find_entry(name);
- if(index == -1) {
- index = add_entry(name);
- assert(index >=0);
- if (index < 0) {
- //hythread_monitor_exit(*p_global_monitor);
- return NULL;
- }
- }
- //hythread_monitor_exit(*p_global_monitor);
- return data+index;
-}
-
-// ================== TLS =======================================
-
-
-JNIEXPORT int __cdecl
-hythread_tls_alloc (hythread_tls_key_t* handle){
- apr_status_t stat = apr_threadkey_private_create(handle, NULL, get_pool());
- RET_ON_ERROR(stat)
- return 0;
-}
-
-JNIEXPORT int __cdecl
-hythread_tls_free (hythread_tls_key_t key){
-
- apr_status_t stat = apr_threadkey_private_delete(key);
- RET_ON_ERROR(stat)
- return 0;
-}
-
-// TODO method work only for current thread
-JNIEXPORT void* __cdecl
-hythread_tls_get (hythread_t thread, hythread_tls_key_t key) {
- void* result;
- apr_status_t stat = apr_threadkey_private_get(&result, key);
- if(stat != 0) {
- return NULL;
- }
- return result;
-}
-
-// TODO method work only for current thread
-JNIEXPORT int __cdecl
-hythread_tls_set (hythread_t thread, hythread_tls_key_t key, void* value){
- apr_status_t stat = apr_threadkey_private_set(value, key);
- RET_ON_ERROR(stat)
- return 0;
-}
-// ==================== create thread ==========================
-//#ifndef WIN32
-static void* APR_THREAD_FUNC hystart_wrapper(apr_thread_t* t , void* args) {
- hythread_entrypoint_t entrypoint = (hythread_entrypoint_t)*((void **)args);
- void* hyargs = *((void**)args+1);
- return (void*) entrypoint(hyargs);
-}
-
-JNIEXPORT int __cdecl
-hythread_create(hythread_t* handle, unsigned stacksize, unsigned priority, unsigned suspend, hythread_entrypoint_t entrypoint, void* entryarg) {
- apr_thread_t *new_thread;
- apr_pool_t *pool = get_pool();
- static void **port_args = (void**)apr_palloc(pool, sizeof(void*)*2);
- port_args[0] = (void*)entrypoint;
- port_args[1] = (void*)entryarg;
- apr_status_t stat = apr_thread_create(&new_thread, NULL, hystart_wrapper,
- port_args, pool);
- RET_ON_ERROR(stat);
- stat = apr_os_thread_get(&handle, new_thread);
- RET_ON_ERROR(stat);
- return 0;
-}
-
-
-JNIEXPORT int __cdecl
-hythread_exit (hythread_monitor_t monitor) {
- apr_status_t stat;
- apr_os_thread_t aott;
- apr_thread_t *att = NULL;
-
- // att = (apr_thread_t*)apr_pcalloc(get_pool(), sizeof(apr_thread_t*));
- aott = apr_os_thread_current();
- stat = apr_os_thread_put(&att, &aott, get_pool());
- RET_ON_ERROR(stat);
-
- if (monitor) {
- hythread_monitor_exit(monitor);
- }
-
- return apr_thread_exit(att, 0);
-}
-
-
-
-
-}// extern "C"
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythreads.h
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythreads.h?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythreads.h (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/hythr/hythreads.h Wed Aug 23 09:48:41 2006
@@ -1,90 +0,0 @@
-/*
- * 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.
- */
-/**
- * @author Artem Aliev
- * @version $Revision: 1.1.2.1.4.4 $
- */
-#include "vm_threads.h"
-#include <apr_general.h>
-#include <apr_thread_mutex.h>
-#include <apr_thread_cond.h>
-#include <apr_thread_proc.h>
-#include <apr_portable.h>
-
-#include<stdio.h>
-#include<assert.h>
-
-#define GLOBAL_MONITOR_NAME "global_monitor"
-extern "C"
-{
-
-JNIEXPORT void __cdecl hythread_init (void* lib);
-// ========================== MONITOR ================================================
-struct hymonitor {
- char* name;
- apr_thread_mutex_t *mutex;
- apr_thread_cond_t *cond;
-};
-
-typedef hymonitor* hythread_monitor_t;
-
-JNIEXPORT int __cdecl hythread_monitor_init_with_name (hythread_monitor_t* handle, unsigned flags, char* name);
-JNIEXPORT int __cdecl
-hythread_monitor_destroy (hythread_monitor_t monitor);
-JNIEXPORT int __cdecl
-hythread_monitor_try_enter (hythread_monitor_t monitor);
-JNIEXPORT int __cdecl
-hythread_monitor_enter (hythread_monitor_t monitor);
-JNIEXPORT int __cdecl
-hythread_monitor_exit (hythread_monitor_t monitor);
-JNIEXPORT int __cdecl
-hythread_monitor_notify (hythread_monitor_t monitor);
-JNIEXPORT int __cdecl
-hythread_monitor_notify_all (hythread_monitor_t monitor);
-JNIEXPORT int __cdecl
-hythread_monitor_wait (hythread_monitor_t monitor);
-
-// ======================= ATTACH ======================================
-typedef apr_os_thread_t hythread_t;
-
-JNIEXPORT int __cdecl
-hythread_attach (hythread_t* handle);
-JNIEXPORT void __cdecl
-hythread_detach (hythread_t handle);
-JNIEXPORT hythread_t __cdecl hythread_self();
-JNIEXPORT int __cdecl
-hythread_exit (hythread_monitor_t monitor);
-
-JNIEXPORT unsigned* __cdecl
-hythread_global (char* name);
-
-// ==================== create thread ====================
-typedef int(__cdecl* hythread_entrypoint_t)(void*);
-JNIEXPORT int __cdecl
-hythread_create(hythread_t* handle, unsigned stacksize, unsigned priority, unsigned suspend, hythread_entrypoint_t entrypoint, void* entryarg);
-// ================== TLS =======================================
-typedef apr_threadkey_t* hythread_tls_key_t;
-
-JNIEXPORT int __cdecl
-hythread_tls_alloc (hythread_tls_key_t* handle);
-JNIEXPORT int __cdecl
-hythread_tls_free (hythread_tls_key_t key);
-JNIEXPORT void* __cdecl
-hythread_tls_get (hythread_t thread, hythread_tls_key_t key);
-JNIEXPORT int __cdecl
-hythread_tls_set (hythread_t thread, hythread_tls_key_t key, void* value);
-
-}// extern "C"
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/lock_manager.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/lock_manager.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/lock_manager.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/lock_manager.cpp Wed Aug 23 09:48:41 2006
@@ -32,38 +32,47 @@
Lock_Manager *p_meth_addr_table_lock;
Lock_Manager *p_thread_lock;
Lock_Manager *p_method_call_lock;
-Lock_Manager *p_tm_lock;
+Lock_Manager *p_handle_lock;
+extern hythread_library_t hythread_lib;
+VMEXPORT void jit_lock() {
+ p_jit_a_method_lock->_lock();
+}
+VMEXPORT void jit_unlock() {
+ p_jit_a_method_lock->_unlock();
+}
Lock_Manager::Lock_Manager()
-{
+{ // init thread menager if needed
+ hythread_init(hythread_lib);
+ UNREF IDATA stat = hymutex_create (&lock, TM_MUTEX_NESTED);
+ assert(stat==TM_ERROR_NONE);
}
Lock_Manager::~Lock_Manager()
{
+ UNREF IDATA stat = hymutex_destroy (lock);
+ assert(stat==TM_ERROR_NONE);
}
void Lock_Manager::_lock()
{
- DEBUG_CONTENDS_LOCK (this);
- _critical_section.lock();
- DEBUG_PUSH_LOCK (this);
+ UNREF IDATA stat = hymutex_lock(lock);
+ assert(stat==TM_ERROR_NONE);
}
bool Lock_Manager::_tryLock()
-{ if(_critical_section.tryLock()) {
- DEBUG_PUSH_LOCK (this);
- return true;
- }
- return false;
+{
+ IDATA stat = hymutex_trylock(lock);
+ return stat==TM_ERROR_NONE;
}
void Lock_Manager::_unlock()
{
- _critical_section.unlock();
- DEBUG_POP_LOCK (this);
+ UNREF IDATA stat = hymutex_unlock(lock);
+ assert(stat==TM_ERROR_NONE);
}
@@ -75,8 +84,7 @@
void Lock_Manager::_unlock_enum()
{
- _critical_section.unlock();
- DEBUG_POP_LOCK (this);
+ Lock_Manager::_unlock();
}
@@ -89,33 +97,23 @@
bool Lock_Manager::_lock_or_null()
{
- bool stat = _critical_section.tryLock();
- if (!stat) {
- return false;
- }
- DEBUG_PUSH_LOCK (this);
- return true;
+ return Lock_Manager::_tryLock();
}
void Lock_Manager::_unlock_or_null()
{
-
- _critical_section.unlock();
- DEBUG_POP_LOCK (this);
+ Lock_Manager::_unlock_enum();
}
void Lock_Manager::_unlock_enum_or_null()
{
- _critical_section.unlock();
- DEBUG_POP_LOCK (this);
+ Lock_Manager::_unlock_enum();
}
bool Lock_Manager::_lock_enum_or_null(bool UNREF return_null_on_fail)
{
- DEBUG_CONTENDS_LOCK (this);
- _critical_section.lock();
- DEBUG_PUSH_LOCK (this);
- return true;
+ IDATA stat = hymutex_lock(lock);
+ return stat==TM_ERROR_NONE;
}
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/mon_enter_exit.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/mon_enter_exit.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/mon_enter_exit.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/mon_enter_exit.cpp Wed Aug 23 09:48:41 2006
@@ -27,348 +27,41 @@
#include "thread_generic.h"
#include "vm_synch.h"
#include "port_atomic.h"
+#include "open/jthread.h"
static void vm_monitor_exit_default(ManagedObject *p_obj);
-static void vm_monitor_exit_default_handle(jobject jobj);
+static void vm_monitor_enter_default(ManagedObject *p_obj);
+
void (*vm_monitor_enter)(ManagedObject *p_obj) = 0;
void (*vm_monitor_exit)(ManagedObject *p_obj) = 0;
-void (*vm_monitor_exit_handle)(jobject jobj) = 0;
-
-volatile int active_thread_count;
-
-mon_enter_fields mon_enter_array[MAX_VM_THREADS];
-
-static void jvmti_push_monitor(jobject jobj);
-static void jvmti_pop_monitor(jobject jobj);
-
-#if defined(USE_TLS_API) || !defined(STACK_BASE_AS_TID)
-uint16 get_self_stack_key()
-{
- return p_TLS_vmthread->stack_key;
-}
-#endif //#ifdef USE_TLS_API || !STACK_BASE_AS_TID
-
-void block_on_mon_enter(jobject obj)
-{
- assert(!tmn_is_suspend_enabled());
- ManagedObject *p_obj = obj->object;
- VM_thread *p_thr = get_thread_ptr();
-
- assert(mon_enter_array[p_thr->thread_index].p_obj == 0);
-
- // set thread state to BLOCKED on monitor
- // RUNNING will be set back before return
- enum java_state old_state = p_thr->app_status;
- p_thr->app_status = thread_is_blocked;
-
-#ifdef _DEBUG
- int loop_count = 0;
-#endif
-
- //since p_obj may be moved by GC in the below loop, we need to reload after gc_enable/disable
- volatile ManagedObject *volatile_p_obj = (ManagedObject *)p_obj;
-
- while (1) {
-
- mon_enter_array[p_thr->thread_index].p_obj = (ManagedObject *)volatile_p_obj;
-
-#ifdef _DEBUG
- loop_count++;
- if (loop_count > max_block_on_mon_enter_loops)
- max_block_on_mon_enter_loops = loop_count;
-#endif
- if ( STACK_KEY(volatile_p_obj) == FREE_MONITOR)
- {
- mon_enter_array[p_thr->thread_index].p_obj = 0;
-
- Boolean retval = vm_try_monitor_enter( (ManagedObject *)volatile_p_obj);
- if (retval){
- assert(p_thr->app_status == thread_is_blocked);
- p_thr->app_status = old_state;
- return;
- }
- else continue;
- }
-
- tmn_suspend_enable();
- p_thr -> is_suspended = true;
-
- // no one sends this event
- // DWORD stat = vm_wait_for_single_object(p_thr->event_handle_monitor, 1);
- vm_yield();
-
- p_thr -> is_suspended = false;
- tmn_suspend_disable();
-
- // by convention, *only* mon_enter_array and mon_wait_array will be enumerated to the GC
- // thus reload from mon_enter_array[] after the waitforsingleobject returns
- ManagedObject* p_obj = (ManagedObject *)
- mon_enter_array[p_thr->thread_index].p_obj;
- assert(managed_object_is_valid(p_obj));
- volatile_p_obj = p_obj;
-
- } //while(1)
-}
-
-
-void find_an_interested_thread(ManagedObject *p_obj)
-{
- assert(!tmn_is_suspend_enabled());
- if ( ( HASH_CONTENTION(p_obj) & CONTENTION_MASK) == 0)
- return; // nobody wants this object
-
- DWORD stat;
- int xx;
-
- for (xx = 1; xx < next_thread_index; xx++)
- {
- if (mon_enter_array[xx].p_obj == p_obj)
- {
- stat = vm_set_event(mon_enter_array[xx].p_thr->event_handle_monitor);
- assert(stat);
-
- return;
- }
- }
-}
void vm_enumerate_root_set_mon_arrays()
{
- TRACE2("enumeration", "enumerating root set monitor arrays");
- int xx;
-
- for (xx = 1; xx < next_thread_index; xx++)
- {
- if (mon_enter_array[xx].p_obj){
- assert( (STACK_KEY( mon_enter_array[xx].p_obj)) != mon_enter_array[xx].p_thr->stack_key );
- vm_enumerate_root_reference((void **)&(mon_enter_array[xx].p_obj), FALSE);
- }
-
- if (mon_wait_array[xx].p_obj){
- assert( mon_wait_array[xx].p_thr->app_status == thread_is_waiting || mon_wait_array[xx].p_thr->app_status == thread_is_timed_waiting);
- vm_enumerate_root_reference((void **)&(mon_wait_array[xx].p_obj), FALSE);
- }
- }
-}
-
-void mon_enter_recursion_overflowed(ManagedObject * UNREF p_obj)
-{
- ABORT("Not implemented"); //TODO: add the backup algorithm for recursion overflow
-
}
void vm_monitor_init()
{
- vm_monitor_enter = vm_monitor_enter_slow;
+ vm_monitor_enter = vm_monitor_enter_default;
vm_monitor_exit = vm_monitor_exit_default;
- vm_monitor_exit_handle = vm_monitor_exit_default_handle;
-}
-
-inline void pause_inst(void){
-#if defined(PLATFORM_POSIX) && !defined(_IPF_)
- __asm__(
-#if !((__GLIBC__ == 2) && (__GLIBC_MINOR__ <= 1))
- "pause"
-#else
- "nop;nop;nop"
-#endif
- : : : "memory"
- );
-
-#else
-#ifdef _IPF_
- // WE WILL DO NOTHING HERE FOR THE TIME BEING...until we can find a suitable & profitable IPF instruction...
-#else // !_IPF_
- _asm{
- pause
- }
-#endif // !_IPF_
-
-#endif
-
-}
-
-
-//return the old monitor stack key, so that 0 means success, otherwise failure;
-Boolean vm_try_monitor_enter(ManagedObject *p_obj)
-{
-
- uint16 current_stack_key = get_self_stack_key();
- uint16 *p_monitor_stack_key = P_STACK_KEY(p_obj);
- uint16 old_stack_key = FREE_MONITOR;
- old_stack_key = port_atomic_cas16(p_monitor_stack_key, current_stack_key, FREE_MONITOR);
- if( old_stack_key == FREE_MONITOR ){
-
- return TRUE;
-
- } else if (old_stack_key == current_stack_key) { //recursed
- ++RECURSION(p_obj);
- if (0 == RECURSION(p_obj)) {
- mon_enter_recursion_overflowed(p_obj);
- }
- return TRUE;
- }
-
- //hold by other thread
- return FALSE;
-}
-
-static inline uint8 get_recursion(jobject jobj) {
- assert(tmn_is_suspend_enabled());
- tmn_suspend_disable(); // ----------- vv
- uint8 recursion = RECURSION(jobj->object);
- tmn_suspend_enable(); // ------------ ^^
- return recursion;
-}
-
-static inline uint16 get_stack_key(jobject jobj) {
- assert(object_is_valid(jobj));
- tmn_suspend_disable(); // ----------vv
- uint16 *p_stack_key = P_STACK_KEY(jobj->object);
- uint16 result = *p_stack_key;
- tmn_suspend_enable(); // -----------^^
- return result;
-}
-
-static inline uint16 compare_swap_stack_key(jobject jobj, uint16 value, uint16 expected) {
- assert(object_is_valid(jobj));
- tmn_suspend_disable(); // ----------vv
- uint16 *p_stack_key = P_STACK_KEY(jobj->object);
- uint16 old = port_atomic_cas16(p_stack_key, value, expected);
- tmn_suspend_enable(); // -----------^^
- return old;
-}
-
-// this is a first step of a bigger refactoring
-// of VM code to run with gc enabled.
-//
-// this function should be called instead of vm_monitor_enter_slow
-// NOTE, that only ia32 stubs were modified so.
-//
-// -salikh 2005-05-11
-VMEXPORT void vm_monitor_enter_slow_handle (jobject jobj) {
- TRACE2("oh", "vm_monitor_enter_slow_handle()");
- assert(tmn_is_suspend_enabled());
- assert(object_is_valid(jobj));
-
- uint16 current_stack_key = get_self_stack_key();
- uint16 old_stack_key = get_stack_key(jobj);
-
- if (old_stack_key == FREE_MONITOR) { //common case, fastest
- old_stack_key = compare_swap_stack_key(jobj, current_stack_key, FREE_MONITOR);
- if (old_stack_key == FREE_MONITOR) { //ok, got it
- jvmti_push_monitor(jobj);
- return;
- }
- // failed to grab the lock, fall through to contended case
- } else if (old_stack_key == current_stack_key) { //recursed
- tmn_suspend_disable(); // ---------------vv
- ++RECURSION(jobj->object);
- int recursion = RECURSION(jobj->object);
- tmn_suspend_enable(); // ----------------^^
- if (0 == recursion) {
- tmn_suspend_disable(); // -----------vv
- mon_enter_recursion_overflowed(jobj->object);
- tmn_suspend_enable(); // ------------^^
- }
- return;
- }
-
- //hold by other thread, let's spin look for a short while
-
- unsigned int i = SPIN_LOOP_COUNT;
- while (i--) {
- pause_inst();
- if (0 == get_stack_key(jobj)) { //monitor is free now, try to get it
- old_stack_key = compare_swap_stack_key(jobj, current_stack_key, FREE_MONITOR);
- if (old_stack_key == FREE_MONITOR) { //ok, got it
- jvmti_push_monitor(jobj);
- return;
- }
- }
}
- bool isEnter = true;
- jvmti_send_contended_enter_or_entered_monitor_event(jobj, isEnter);
-
- // we have no way to get the lock, then sleep;
- tmn_suspend_disable();
- block_on_mon_enter(jobj);
- tmn_suspend_enable();
-
- assert(object_is_valid(jobj));
- if (get_stack_key(jobj) != current_stack_key) {
- DIE("Wrong monitor states after GC: " << jobj << ")");
- }
-
- return;
-}
-
-void vm_monitor_enter_slow(ManagedObject *p_obj)
+static void vm_monitor_enter_default(ManagedObject *p_obj)
{
- assert(!tmn_is_suspend_enabled());
+ assert(!hythread_is_suspend_enabled());
assert(p_obj);
jobject jobj = oh_allocate_local_handle();
jobj->object = p_obj;
- tmn_suspend_enable(); // we've protected the argument
- vm_monitor_enter_slow_handle(jobj);
- tmn_suspend_disable(); // restore suspend enabled state
+ jthread_monitor_enter(jobj);
}
-static void vm_monitor_exit_default_handle(jobject jobj) {
- assert(object_is_valid(jobj));
-
- uint16 current_stack_key = get_self_stack_key();
-
- uint16 monitor_stack_key = get_stack_key(jobj);
- if (monitor_stack_key == current_stack_key) { //common case, fastest path
- if (!get_recursion(jobj)) { //no recursion
- tmn_suspend_disable(); // ----------------------vv
- STACK_KEY(jobj->object) = FREE_MONITOR; //release the lock
- if (HASH_CONTENTION(jobj->object) & CONTENTION_MASK) { //contented
- find_an_interested_thread(jobj->object);
- }
- tmn_suspend_enable(); // -----------------------^^
- jvmti_pop_monitor(jobj);
- } else { //recursed
- tmn_suspend_disable(); // ----------------------vv
- RECURSION(jobj->object)--;
- tmn_suspend_enable(); // -----------------------^^
- }
-
- } else { //illegal monitor state
- exn_throw_by_name("java/lang/IllegalMonitorStateException");
- }
-
- assert(tmn_is_suspend_enabled());
-}
-
-
-
static void vm_monitor_exit_default(ManagedObject *p_obj)
{
assert(managed_object_is_valid(p_obj));
jobject jobj = oh_allocate_local_handle();
jobj->object = p_obj;
- tmn_suspend_enable();
- vm_monitor_exit_default_handle(jobj);
- tmn_suspend_disable();
-}
-
-//#endif // !_IPF_
-
-void set_hash_bits(ManagedObject *p_obj)
-{
- uint8 hb = (uint8) (((POINTER_SIZE_INT)p_obj >> 3) & HASH_MASK) ;
- // lowest 3 bits are not random enough so get rid of them
-
- if (hb == 0)
- hb = (23 & HASH_MASK); // NO hash = zero allowed, thus hard map hb = 0 to a fixed prime number
-
- // don't care if the cmpxchg fails -- just means someone else already set the hash
- port_atomic_cas8(P_HASH_CONTENTION(p_obj),hb, 0);
+ jthread_monitor_exit(jobj);
}
@@ -382,72 +75,5 @@
Boolean verify_object_header(void *ptr)
{
- ManagedObject *p_obj = (ManagedObject *) ptr;
- if (p_obj->get_obj_info() == 0) {
- // ZERO header is valid.
return FALSE;
}
-
- uint16 stack_key = STACK_KEY(p_obj);
- // Recursion can be any 8-bit value...no way to check integrity.
- // Contention bit can remain ON in our current implemenation at arbitrary times.
- // Hash can be zero or non-zero at any given time, though it doesnt change after it goes non-zero
-
- // Not much I can check here....can I????
-
- // So I will check only if the monitor lock is held and if so by a valid thread.
-
- if (stack_key == 0) {
- // No thread owns the object lock
- return FALSE;
- }
-
- // Object monitor is held.
-
- Boolean res = TRUE;
- tmn_suspend_enable();
- tm_iterator_t * iterator = tm_iterator_create();
- tmn_suspend_disable();
- VM_thread *thread = tm_iterator_next(iterator);
- assert(thread);
-
- while (thread) {
- if (thread->thread_index == stack_key) {
- res = TRUE;
- break;
- }
- thread = tm_iterator_next(iterator);
- }
- tm_iterator_release(iterator);
- // What should the return value be?
- return res;
-}
-
-static void jvmti_push_monitor(jobject jobj)
-{
- assert(tmn_is_suspend_enabled());
- if (VM_Global_State::loader_env->TI->isEnabled()) {
- VM_thread *thread = p_TLS_vmthread;
- assert(thread -> jvmti_owned_monitor_count < MAX_OWNED_MONITORS);
- ObjectHandle oh = oh_allocate_global_handle();
- tmn_suspend_disable(); // ----------- vv
- oh -> object = jobj -> object;
- tmn_suspend_enable(); // ------------ ^^
- thread -> jvmti_owned_monitors[thread -> jvmti_owned_monitor_count++] = (jobject) oh;
- }
-}
-
-static void jvmti_pop_monitor(jobject UNREF jobj)
-{
- assert(tmn_is_suspend_enabled());
- if (VM_Global_State::loader_env->TI->isEnabled()) {
- VM_thread *thread = p_TLS_vmthread;
- if (thread -> jvmti_owned_monitor_count <= 0) return;
- assert(thread -> jvmti_owned_monitor_count > 0);
-
- ObjectHandle oh = (ObjectHandle)
- thread -> jvmti_owned_monitors[--thread -> jvmti_owned_monitor_count];
- oh_deallocate_global_handle(oh);
- }
-}
-
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp?rev=434076&r1=434075&r2=434076&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/thread/object_generic.cpp Wed Aug 23 09:48:41 2006
@@ -40,11 +40,13 @@
#include "vm_arrays.h"
#include "thread_generic.h"
-#include "open/thread.h"
+
+#include "open/jthread.h"
#include "thread_manager.h"
#include "object.h"
#include "object_generic.h"
#include "mon_enter_exit.h"
+#include "port_atomic.h"
#include "jit_runtime_support_common.h"
@@ -52,272 +54,28 @@
#include "interpreter.h"
#include "vm_log.h"
-mon_wait_fields mon_wait_array[MAX_VM_THREADS];
-
-#ifdef _DEBUG
-// loose, approximate counts, full of race conditions
-int max_notifyAll = 0;
-int max_recursion = 0;
-int total_sleep_timeouts = 0;
-int total_sleep_interrupts = 0;
-int total_wait_timeouts = 0;
-int total_wait_interrupts = 0;
-int total_illegal_mon_state_exceptions = 0;
-int iterations_per_thread[MAX_VM_THREADS];
-int max_block_on_mon_enter_loops = 0;
-#endif
-
-static inline bool object_locked_by_current_thread(jobject jobj) {
- uint16 current_stack_key = get_self_stack_key();
- bool result = false;
- assert(!tmn_is_suspend_enabled());
- result = (STACK_KEY(jobj->object) == current_stack_key);
- TRACE2("stack_key", "self = " << current_stack_key
- << ", locked by " << STACK_KEY(jobj->object)
- << ", result = " << result);
- return result;
-}
-
-void notify_internal (jobject jobj, Boolean all)
-{
-
- tmn_suspend_disable_recursive();
- assert(jobj->object->vt()->clss->vtable->clss->vtable);
-
- if (!object_locked_by_current_thread(jobj))
+void set_hash_bits(ManagedObject *p_obj)
{
- tmn_suspend_enable_recursive();
- exn_raise_by_name("java/lang/IllegalMonitorStateException");
- return;
- }
-
-#ifdef _DEBUG
- int notifyAll_count = 0;
-#endif
-
- DWORD stat;
- int xx;
-
- for (xx = 1; xx < next_thread_index; xx++)
- {
- if (mon_wait_array[xx].p_obj == jobj->object)
- {
- stat = vm_set_event(mon_wait_array[xx].p_thr->event_handle_notify_or_interrupt);
-#ifdef _DEBUG
- if(!stat) {
- WARN("set notify event failed: " << IJGetLastError());
- }
-#endif
- if (!all)
- break;
-
-#ifdef _DEBUG
- notifyAll_count++;
- if (notifyAll_count > max_notifyAll)
- max_notifyAll = notifyAll_count;
-#endif
- }
- }
- tmn_suspend_enable_recursive();
-}
-
-void thread_object_notify (jobject jobj)
-{
- java_lang_Object_notify (jobj);
-}
-void java_lang_Object_notify (jobject jobj)
-{
- TRACE2("notify", "Notify " << p_TLS_vmthread->thread_handle << " on " << jobj);
- //assert(tmn_is_suspend_enabled());
-
- notify_internal(jobj, false);
-
- //assert(tmn_is_suspend_enabled());
- TRACE2("notify", "Finish Notify " << p_TLS_vmthread->thread_handle << " on " << jobj);
-}
-
-void thread_object_notify_all (jobject jobj)
-{
- java_lang_Object_notifyAll (jobj);
-}
-
-void java_lang_Object_notifyAll (jobject jobj)
-{
- TRACE2("notify", "Notify all " << p_TLS_vmthread->thread_handle << " on " << jobj);
-
- notify_internal(jobj, true);
+ uint8 hb = (uint8) (((POINTER_SIZE_INT)p_obj >> 3) & HASH_MASK) ;
+ // lowest 3 bits are not random enough so get rid of them
- TRACE2("notify", "Finish notify all " << p_TLS_vmthread->thread_handle << " on " << jobj);
-}
+ if (hb == 0)
+ hb = (23 & HASH_MASK); // NO hash = zero allowed, thus hard map hb = 0 to a fixed prime number
-void thread_object_wait_nanos(jobject jobj, int64 msec, int nanosec) {
- /*
- * We have to do something in the case millis == 0 and nanos > 0,
- * because otherwise we'll wait infinitely, also just return whould
- * be incorrect because we have to relese lock for a while:
- */
- msec += (msec==0 && nanosec>0)?1:0;
- java_lang_Object_wait(jobj, msec);
-}
-
-void thread_object_wait(jobject jobj, int64 msec)
-{
- java_lang_Object_wait(jobj, msec);
+ // don't care if the cmpxchg fails -- just means someone else already set the hash
+ port_atomic_cas8(P_HASH_CONTENTION_BYTE(p_obj),hb, 0);
}
-int java_lang_Object_wait(jobject jobj, int64 msec)
-{
- assert(tmn_is_suspend_enabled());
-
- // ? 2003-06-23. The lock needs to be unreserved.
- if (msec < 0)
- {
- exn_raise_by_name("java/lang/IllegalArgumentException");
- return -1;
- }
-
- assert(object_is_valid(jobj));
- tmn_suspend_disable();
-
- if (!object_locked_by_current_thread(jobj))
- {
- tmn_suspend_enable();
- exn_raise_by_name("java/lang/IllegalMonitorStateException");
- return -1;
- }
-
- VM_thread *p_thr = get_thread_ptr();
- DWORD stat;
- // toss stale notifies
- stat = vm_reset_event(p_thr->event_handle_notify_or_interrupt);
-
- // check prior interrupts.
- if (p_thr->interrupt_a_waiting_thread)
- {
- p_thr->interrupt_a_waiting_thread = false;
- tmn_suspend_enable();
- exn_raise_by_name("java/lang/InterruptedException");
-
- return -1;
- }
-
- tmn_suspend_enable();
- assert(tmn_is_suspend_enabled());
- tm_acquire_tm_lock();
- assert(p_thr->app_status == thread_is_running);
- if(msec == 0 /*&& nanos == 0 // added for nanos support*/) {
- p_thr->app_status = thread_is_waiting;
- } else {
- p_thr->app_status = thread_is_timed_waiting;
- }
- tm_release_tm_lock();
- tmn_suspend_disable();
- assert(p_thr->notify_recursion_count == 0);
- assert(mon_wait_array[p_thr->thread_index].p_obj == 0);
- mon_wait_array[p_thr->thread_index].p_obj = jobj->object;
- p_thr->notify_recursion_count = RECURSION(jobj->object);
- RECURSION(jobj->object) = 0; // leave the recursion at zero for the next lock owner
-
-#ifdef _DEBUG
- if (p_thr->notify_recursion_count > max_recursion)
- max_recursion = p_thr->notify_recursion_count;
-#endif
-
- STACK_KEY(jobj->object) = FREE_MONITOR; // finally, give up the lock
-
-
- find_an_interested_thread(jobj->object);
- tmn_suspend_enable();
-
- TRACE2("wait", "thread going to wait " << p_TLS_vmthread->thread_handle);
-
- assert(tmn_is_suspend_enabled());
- p_thr -> is_suspended = true;
- if (msec == 0)
- {
- stat = vm_wait_for_single_object(p_thr->event_handle_notify_or_interrupt, INFINITE);
- assert(stat == WAIT_OBJECT_0);
- }
- else
- {
-#if defined (__INTEL_COMPILER)
-#pragma warning( push )
-#pragma warning (disable:1683) // to get rid of remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type
-#endif
- stat = vm_wait_for_single_object(p_thr->event_handle_notify_or_interrupt, (int)msec);
-
-#if defined (__INTEL_COMPILER)
-#pragma warning( pop )
-#endif
-
- assert( (stat == WAIT_OBJECT_0) || (stat == WAIT_TIMEOUT) );
- }
- p_thr -> is_suspended = false;
-
- TRACE2("wait", "thread finished waiting " << p_TLS_vmthread->thread_handle);
-
-#ifdef _DEBUG
- if (stat == WAIT_OBJECT_0)
- total_wait_interrupts++;
- else
- total_wait_timeouts++;
-#endif
-
- assert(object_is_valid(jobj));
- tmn_suspend_disable();
- //GC may have moved the object sitting in mon_wait_array[], thus reload it
- assert(mon_wait_array[p_thr->thread_index].p_obj->vt()->clss->vtable->clss->vtable);
- assert(mon_wait_array[p_thr->thread_index].p_obj == jobj->object); // jobj should have been updated too -salikh
-
- mon_wait_array[p_thr->thread_index].p_obj = 0;
- //do we need to do a p4 sfence here?
- // lock will do sfence.
- tmn_suspend_enable();
-
- assert(tmn_is_suspend_enabled());
- tm_acquire_tm_lock();
-
- assert(p_thr->app_status == thread_is_waiting || p_thr->app_status == thread_is_timed_waiting);
- p_thr->app_status = thread_is_running;
-
- // now we need to re-acquire the object lock
- // since block_on_mon_enter() can block, reload p_obj
- tm_release_tm_lock(); //with gc_disabled xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- tmn_suspend_disable();
-
- block_on_mon_enter(jobj);
- assert(jobj->object->vt()->clss->vtable->clss->vtable);
-
- assert(object_locked_by_current_thread(jobj));
-
- // re-install the recursion count
- assert(RECURSION(jobj->object) == 0);
- RECURSION(jobj->object) = (uint8)p_thr->notify_recursion_count;
-
- p_thr->notify_recursion_count = 0;
-
- tmn_suspend_enable();
- if ( (stat == WAIT_OBJECT_0) && (p_thr->interrupt_a_waiting_thread == true) )
- {
- p_thr->interrupt_a_waiting_thread = false;
- exn_raise_by_name("java/lang/InterruptedException");
- }
-
- return stat;
-
- // ready to return to java code
-}
-
long generic_hashcode(ManagedObject * p_obj)
{
if (!p_obj) return 0L;
- if ( HASH_CONTENTION(p_obj) & HASH_MASK)
- return HASH_CONTENTION(p_obj) & HASH_MASK;
+ if ( *P_HASH_CONTENTION_BYTE(p_obj) & HASH_MASK)
+ return *P_HASH_CONTENTION_BYTE(p_obj) & HASH_MASK;
set_hash_bits(p_obj);
- if ( HASH_CONTENTION(p_obj) & HASH_MASK)
- return HASH_CONTENTION(p_obj) & HASH_MASK;
+ if ( *P_HASH_CONTENTION_BYTE(p_obj) & HASH_MASK)
+ return *P_HASH_CONTENTION_BYTE(p_obj) & HASH_MASK;
ASSERT(0, "All the possible cases are supposed to be covered before");
return 0xff;
@@ -338,22 +96,10 @@
return hash;
}
-#define NEW_ARRAY(X) new_arr = jenv->New##X##Array(length); assert(new_arr);
-
-#define GET_ARRAY_ELEMENTS(X, Y) src_bytes = jenv->Get##X##ArrayElements((j##Y##Array)jobj, &is_copy); \
- dst_bytes = jenv->Get##X##ArrayElements((j##Y##Array)new_arr, &is_copy);
-
-#define MEMCPY(X) tmn_suspend_disable(); memcpy(dst_bytes, src_bytes, sizeof(j##X) * length); tmn_suspend_enable();
-
-#define RELEASE_ARRAY_ELEMENTS(X, Y) jenv->Release##X##ArrayElements((j##Y##Array)new_arr, (j##Y *) dst_bytes, 0); \
- jenv->Release##X##ArrayElements((j##Y##Array)jobj, (j##Y *)src_bytes, JNI_ABORT);
-
-#define HANDLE_TYPE_COPY(A, B) NEW_ARRAY(A) GET_ARRAY_ELEMENTS(A, B) MEMCPY(B) RELEASE_ARRAY_ELEMENTS(A, B)
-
jobject object_clone(JNIEnv *jenv, jobject jobj)
{
ManagedObject *result;
- assert(tmn_is_suspend_enabled());
+ assert(hythread_is_suspend_enabled());
if(!jobj) {
// Throw NullPointerException.
throw_exception_from_jni(jenv, "java/lang/NullPointerException", 0);