[kaffe] CVS kaffe (robilad): added the Unsafe.c file
Kaffe CVS
cvs-commits at kaffe.org
Thu Feb 21 23:15:21 PST 2008
PatchSet 7766
Date: 2008/02/22 07:02:32
Author: robilad
Branch: HEAD
Tag: (none)
Log:
added the Unsafe.c file
2008-02-21 Dalibor Topic <robilad at kaffe.org>
* libraries/clib/native/Unsafe.c: New file.
Members:
ChangeLog:1.5266->1.5267
libraries/clib/native/Unsafe.c:INITIAL->1.1
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.5266 kaffe/ChangeLog:1.5267
--- kaffe/ChangeLog:1.5266 Fri Feb 22 07:00:35 2008
+++ kaffe/ChangeLog Fri Feb 22 07:02:32 2008
@@ -1,5 +1,9 @@
2008-02-21 Dalibor Topic <robilad at kaffe.org>
+ * libraries/clib/native/Unsafe.c: New file.
+
+2008-02-21 Dalibor Topic <robilad at kaffe.org>
+
* configure.ac : Check for glib.
* kaffe/kaffevm/Makefile.am (AM_CPPFLAGS): Added GLIB_CFLAGS.
===================================================================
Checking out kaffe/libraries/clib/native/Unsafe.c
RCS: /home/cvs/kaffe/kaffe/libraries/clib/native/Unsafe.c,v
VERS: 1.1
***************
--- /dev/null Sun Aug 4 19:57:58 2002
+++ kaffe/libraries/clib/native/Unsafe.c Fri Feb 22 07:15:20 2008
@@ -0,0 +1,188 @@
+/* Unsafe.c - Unsafe operations needed for concurrency
+ Copyright (C) 2008 Dalibor Topic <robilad at kaffe.org>
+
+This file is part of Kaffe.
+
+Kaffe is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+Kaffe is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Kaffe; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+#include <glib.h>
+#include <jni.h>
+
+#include "object.h"
+#include "support.h"
+
+/**
+ * Get the offset of a field.
+ *
+ * @param env JNI interface pointer
+ * @param unsafe unused
+ * @param field an java.lang.reflect.Field instance
+ *
+ * @return offset of the field.
+ */
+JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv* env, jobject unsafe UNUSED, jobject field)
+{
+ const jlong FAILED = -1;
+
+ /* First get the Field class. */
+ jclass fieldClass = (*env)->FindClass (env, "java/reflect/Field");
+ if (NULL != fieldClass) {
+ /* Then get the slot field ID */
+ jfieldID slotID = (*env)->GetFieldID(env, fieldClass, "slot", "I");
+ if (NULL != slotID)
+ /* Return the slot for the given field. */
+ return (*env)->GetIntField(env, field, slotID);
+
+ }
+ /* If for some reason I we can get the Field class or the ID of the slot field,
+ return and let the exception handling deal with the reason.
+ */
+ return FAILED;
+}
+
+/**
+ * Find the address of a field.
+ *
+ * @param env pointer to the JNI environment.
+ * @param obj object containing the field.
+ * @param offset slot of the field
+ *
+ * @return field's address.
+ */
+static volatile void * getFieldAddress(JNIEnv *env, jobject obj, jlong offset)
+{
+ jclass clazz = (*env)->GetObjectClass(env, obj);
+ return KaffeVM_GetFieldAddress(clazz, obj, offset);
+}
+
+
+/**
+ * Helper macro, defining a sun.misc.Unsafe compare and swap function
+ * with a given NAME tail and TYPE of arguments.
+ */
+#define KAFFE_UNSAFE_COMPARE_AND_SWAP(NAME, TYPE) \
+JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwap ## NAME(JNIEnv* env, jobject unsafe UNUSED, jobject obj, jlong offset, TYPE expect, TYPE update) \
+{ \
+ volatile TYPE * address = getFieldAddress(env, obj, offset); \
+ if (sizeof(TYPE) == sizeof(gint)) \
+ return g_atomic_int_compare_and_exchange((volatile gint *) address, (gint) expect, (gint) update); \
+ else if (sizeof(TYPE) == sizeof(gpointer)) \
+ return g_atomic_pointer_compare_and_exchange((volatile gpointer *) address, (gpointer) expect, (gpointer) update); \
+ else \
+ if (*address == expect) { \
+ *address = update; \
+ return JNI_TRUE; \
+ } \
+ else \
+ return JNI_FALSE; \
+} \
+
+KAFFE_UNSAFE_COMPARE_AND_SWAP(Int, jint)
+KAFFE_UNSAFE_COMPARE_AND_SWAP(Long, jlong)
+KAFFE_UNSAFE_COMPARE_AND_SWAP(Object, jobject)
+
+#define KAFFE_UNSAFE_PUT(ACCESS, NAME, TYPE) \
+ ACCESS void JNICALL Java_sun_misc_Unsafe_put ## NAME (JNIEnv* env, jobject unsafe UNUSED, jobject obj, jlong offset, TYPE value) \
+ { \
+ volatile TYPE * address = getFieldAddress(env, obj, offset); \
+ *address = value; \
+ }
+
+KAFFE_UNSAFE_PUT(static, Int, jint)
+KAFFE_UNSAFE_PUT(JNIEXPORT, Long, jlong)
+KAFFE_UNSAFE_PUT(JNIEXPORT, Object, jobject)
+
+#define KAFFE_UNSAFE_PUT_BODY(NAME) \
+ { \
+ /* Delegate this to the default implementation. */ \
+ return Java_sun_misc_Unsafe_put ## NAME (env, unsafe, obj, offset, value); \
+ }
+
+#define KAFFE_UNSAFE_PUT_ORDERED(NAME, TYPE) \
+ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrdered ## NAME(JNIEnv* env, jobject unsafe, jobject obj, jlong offset, TYPE value) \
+ KAFFE_UNSAFE_PUT_BODY(NAME)
+
+#define KAFFE_UNSAFE_PUT_VOLATILE(NAME, TYPE) \
+ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_put ## NAME ## Volatile (JNIEnv* env, jobject unsafe, jobject obj, jlong offset, TYPE value) \
+ KAFFE_UNSAFE_PUT_BODY(NAME)
+
+#define KAFFE_UNSAFE_PUT_FUNCTIONS(TYPE) \
+ KAFFE_UNSAFE_PUT_ ## TYPE (Int, jint) \
+ KAFFE_UNSAFE_PUT_ ## TYPE (Long, jlong) \
+ KAFFE_UNSAFE_PUT_ ## TYPE (Object, jobject)
+
+KAFFE_UNSAFE_PUT_FUNCTIONS(ORDERED)
+KAFFE_UNSAFE_PUT_FUNCTIONS(VOLATILE)
+
+#define KAFFE_UNSAFE_GET(ACCESS, NAME, TYPE) \
+ ACCESS TYPE JNICALL Java_sun_misc_Unsafe_get ## NAME(JNIEnv* env, jobject unsafe UNUSED, jobject obj, jlong offset) \
+ { \
+ volatile TYPE * address = getFieldAddress(env, obj, offset); \
+ return *address; \
+ }
+
+KAFFE_UNSAFE_GET(static, Int, jint)
+KAFFE_UNSAFE_GET(JNIEXPORT, Long, jlong)
+KAFFE_UNSAFE_GET(static, Object, jobject)
+
+#define KAFFE_UNSAFE_GET_VOLATILE(NAME, TYPE) \
+ JNIEXPORT TYPE JNICALL Java_sun_misc_Unsafe_get ## NAME ## Volatile(JNIEnv* env, jobject unsafe, jobject obj, jlong offset) \
+ { \
+ return Java_sun_misc_Unsafe_get ## NAME (env, unsafe, obj, offset); \
+ }
+
+KAFFE_UNSAFE_GET_VOLATILE(Int, jint)
+KAFFE_UNSAFE_GET_VOLATILE(Long, jlong)
+KAFFE_UNSAFE_GET_VOLATILE(Object, jobject)
+
+JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv* env UNUSED, jobject unsafe UNUSED, jclass arrayClass UNUSED)
+{
+ return ARRAY_DATA_OFFSET;
+}
+
+JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv* env UNUSED, jobject unsafe UNUSED, jclass arrayClass UNUSED)
+{
+ return sizeof(double);
+}
+
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv* env UNUSED, jobject unsafe UNUSED, jobject park UNUSED)
+{
+ /** FIXME */
+}
+
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv* env UNUSED, jobject unsafe UNUSED, jboolean flag UNUSED, jlong duration UNUSED)
+{
+ /** FIXME */
+}
+
More information about the kaffe
mailing list