Mercurial > hg > truffle
view test/runtime/6929067/invoke.c @ 14649:f6301b007a16
6498581: ThreadInterruptTest3 produces wrong output on Windows
Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set.
Reviewed-by: acorn, kvn
Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author | minqi |
---|---|
date | Wed, 26 Feb 2014 15:20:41 -0800 |
parents | 3b3d12e645e7 |
children |
line wrap: on
line source
#include <assert.h> #include <jni.h> #include <alloca.h> #include <pthread.h> union env_union { void *void_env; JNIEnv *jni_env; }; union env_union tmp; JNIEnv* env; JavaVM* jvm; JavaVMInitArgs vm_args; JavaVMOption options[1]; jclass class_id; jmethodID method_id; jint result; long product(unsigned long n, unsigned long m) { if (m == 1) { return n; } else { int *p = alloca(sizeof (int)); *p = n; return product (n, m-1) + *p; } } void * floobydust (void *p) { (*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL); env = tmp.jni_env; class_id = (*env)->FindClass (env, "T"); assert (class_id); method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V"); assert (method_id); (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL); (*jvm)->DetachCurrentThread(jvm); printf("%ld\n", product(5000,5000)); (*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL); env = tmp.jni_env; class_id = (*env)->FindClass (env, "T"); assert (class_id); method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V"); assert (method_id); (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL); (*jvm)->DetachCurrentThread(jvm); printf("%ld\n", product(5000,5000)); return NULL; } int main (int argc, const char** argv) { options[0].optionString = "-Xss320k"; vm_args.version = JNI_VERSION_1_2; vm_args.ignoreUnrecognized = JNI_TRUE; vm_args.options = options; vm_args.nOptions = 1; result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args); assert (result >= 0); env = tmp.jni_env; floobydust (NULL); pthread_t thr; pthread_create (&thr, NULL, floobydust, NULL); pthread_join (thr, NULL); return 0; }