diff src/share/vm/prims/jni.cpp @ 1078:8e7adf982378

6896043: first round of zero fixes Reviewed-by: kvn Contributed-by: Gary Benson <gbenson@redhat.com>
author twisti
date Fri, 27 Nov 2009 07:56:58 -0800
parents 08780c8a9f04
children 896da934748c
line wrap: on
line diff
--- a/src/share/vm/prims/jni.cpp	Tue Nov 24 11:49:42 2009 -0800
+++ b/src/share/vm/prims/jni.cpp	Fri Nov 27 07:56:58 2009 -0800
@@ -3231,6 +3231,21 @@
   jint result = JNI_ERR;
   DT_RETURN_MARK(CreateJavaVM, jint, (const jint&)result);
 
+  // We're about to use Atomic::xchg for synchronization.  Some Zero
+  // platforms use the GCC builtin __sync_lock_test_and_set for this,
+  // but __sync_lock_test_and_set is not guaranteed to do what we want
+  // on all architectures.  So we check it works before relying on it.
+#if defined(ZERO) && defined(ASSERT)
+  {
+    jint a = 0xcafebabe;
+    jint b = Atomic::xchg(0xdeadbeef, &a);
+    void *c = &a;
+    void *d = Atomic::xchg_ptr(&b, &c);
+    assert(a == 0xdeadbeef && b == (jint) 0xcafebabe, "Atomic::xchg() works");
+    assert(c == &b && d == &a, "Atomic::xchg_ptr() works");
+  }
+#endif // ZERO && ASSERT
+
   // At the moment it's only possible to have one Java VM,
   // since some of the runtime state is in global variables.