1 /* src/native/vm/sun_misc_Unsafe.c - sun/misc/Unsafe
3 Copyright (C) 2006, 2007 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 $Id: java_lang_VMObject.c 5153 2006-07-18 08:19:24Z twisti $
34 #include "mm/memory.h"
36 #include "native/jni.h"
37 #include "native/native.h"
39 #include "native/include/java_lang_Object.h" /* before c.l.C */
40 #include "native/include/java_lang_String.h" /* required by j.l.CL */
42 #if defined(WITH_CLASSPATH_SUN)
43 # include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
46 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
47 #include "native/include/java_lang_Class.h"
48 #include "native/include/java_lang_reflect_Field.h"
49 #include "native/include/java_lang_Thread.h" /* required by s.m.U */
50 #include "native/include/java_lang_Throwable.h"
52 #if defined(WITH_CLASSPATH_SUN)
53 # include "native/include/java_security_ProtectionDomain.h" /* required by smU*/
56 #include "native/include/sun_misc_Unsafe.h"
58 #include "vm/exceptions.h"
59 #include "vm/initialize.h"
61 #include "vmcore/utf8.h"
64 /* native methods implemented by this file ************************************/
66 static JNINativeMethod methods[] = {
67 { "registerNatives", "()V", (void *) (intptr_t) &Java_sun_misc_Unsafe_registerNatives },
68 { "getInt", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J },
69 { "getBoolean", "(Ljava/lang/Object;J)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_getBoolean },
70 { "putBoolean", "(Ljava/lang/Object;JZ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putBoolean },
71 { "getByte", "(Ljava/lang/Object;J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J },
72 { "putByte", "(Ljava/lang/Object;JB)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB },
73 { "getChar", "(Ljava/lang/Object;J)C", (void *) (intptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J },
74 { "putChar", "(Ljava/lang/Object;JC)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC },
75 { "getByte", "(J)B", (void *) (intptr_t) &Java_sun_misc_Unsafe_getByte__J },
76 { "getInt", "(J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__J },
77 { "getLong", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_getLong__J },
78 { "putLong", "(JJ)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_putLong__JJ },
79 { "objectFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_objectFieldOffset },
80 { "allocateMemory", "(J)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_allocateMemory },
81 { "freeMemory", "(J)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_freeMemory },
82 { "staticFieldOffset", "(Ljava/lang/reflect/Field;)J", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldOffset },
83 { "staticFieldBase", "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_staticFieldBase },
84 { "ensureClassInitialized", "(Ljava/lang/Class;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_ensureClassInitialized },
85 { "throwException", "(Ljava/lang/Throwable;)V", (void *) (intptr_t) &Java_sun_misc_Unsafe_throwException },
86 { "compareAndSwapObject", "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject },
87 { "compareAndSwapInt", "(Ljava/lang/Object;JII)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt },
88 { "compareAndSwapLong", "(Ljava/lang/Object;JJJ)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong },
89 { "getObjectVolatile", "(Ljava/lang/Object;J)Ljava/lang/Object;", (void *) (intptr_t) &Java_sun_misc_Unsafe_getObjectVolatile },
90 { "getIntVolatile", "(Ljava/lang/Object;J)I", (void *) (intptr_t) &Java_sun_misc_Unsafe_getIntVolatile },
94 /* _Jv_sun_misc_Unsafe_init ****************************************************
96 Register native functions.
98 *******************************************************************************/
100 void _Jv_sun_misc_Unsafe_init(void)
104 u = utf_new_char("sun/misc/Unsafe");
106 native_method_register(u, methods, NATIVE_METHODS_COUNT);
111 * Class: sun/misc/Unsafe
112 * Method: registerNatives
115 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv *env, jclass clazz)
117 /* The native methods of this function are already registered in
118 _Jv_sun_misc_Unsafe_init() which is called during VM
124 * Class: sun/misc/Unsafe
126 * Signature: (Ljava/lang/Object;J)I
128 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
133 p = (int32_t *) (((uint8_t *) o) + offset);
142 * Class: sun/misc/Unsafe
144 * Signature: (Ljava/lang/Object;J)Z
146 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
151 p = (int32_t *) (((uint8_t *) o) + offset);
160 * Class: sun/misc/Unsafe
162 * Signature: (Ljava/lang/Object;JZ)V
164 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
168 p = (int32_t *) (((uint8_t *) o) + offset);
175 * Class: sun/misc/Unsafe
177 * Signature: (Ljava/lang/Object;J)B
179 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
184 p = (int32_t *) (((uint8_t *) o) + offset);
193 * Class: sun/misc/Unsafe
195 * Signature: (Ljava/lang/Object;JB)V
197 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
201 p = (int32_t *) (((uint8_t *) o) + offset);
208 * Class: sun/misc/Unsafe
210 * Signature: (Ljava/lang/Object;J)C
212 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
217 p = (int32_t *) (((uint8_t *) o) + offset);
226 * Class: sun/misc/Unsafe
228 * Signature: (Ljava/lang/Object;JC)V
230 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
234 p = (int32_t *) (((uint8_t *) o) + offset);
241 * Class: sun/misc/Unsafe
245 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
250 p = (int8_t *) (intptr_t) address;
254 return (int32_t) value;
259 * Class: sun/misc/Unsafe
263 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
268 p = (int32_t *) (intptr_t) address;
277 * Class: sun/misc/Unsafe
281 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
286 p = (int64_t *) (intptr_t) address;
295 * Class: sun/misc/Unsafe
299 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, sun_misc_Unsafe *this, int64_t address, int64_t value)
303 p = (int64_t *) (intptr_t) address;
310 * Class: sun/misc/Unsafe
311 * Method: objectFieldOffset
312 * Signature: (Ljava/lang/reflect/Field;)J
314 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, sun_misc_Unsafe* this, java_lang_reflect_Field* field)
319 c = (classinfo *) field->clazz;
320 f = &c->fields[field->slot];
322 return (int64_t) f->offset;
327 * Class: sun/misc/Unsafe
328 * Method: allocateMemory
331 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t bytes)
336 length = (size_t) bytes;
338 if ((length != (uint64_t) bytes) || (bytes < 0)) {
339 exceptions_throw_illegalargumentexception();
343 p = MNEW(uint8_t, length);
345 return (int64_t) (intptr_t) p;
350 * Class: sun/misc/Unsafe
354 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, sun_misc_Unsafe *this, int64_t address)
358 p = (void *) (intptr_t) address;
363 /* we pass length 1 to trick the free function */
365 MFREE(p, uint8_t, 1);
370 * Class: sun/misc/Unsafe
371 * Method: staticFieldOffset
372 * Signature: (Ljava/lang/reflect/Field;)J
374 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *field)
379 c = (classinfo *) field->clazz;
380 f = &(c->fields[field->slot]);
382 return (int64_t) (intptr_t) &(f->value);
387 * Class: sun/misc/Unsafe
388 * Method: staticFieldBase
389 * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object;
391 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, sun_misc_Unsafe *this, java_lang_reflect_Field *f)
393 /* In CACAO we return the absolute address in staticFieldOffset. */
400 * Class: sun/misc/Unsafe
401 * Method: ensureClassInitialized
402 * Signature: (Ljava/lang/Class;)V
404 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Class *class)
408 c = (classinfo *) class;
410 if (!(c->state & CLASS_INITIALIZED))
416 * Class: sun/misc/Unsafe
417 * Method: throwException
418 * Signature: (Ljava/lang/Throwable;)V
420 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Throwable *ee)
422 java_objectheader *o;
424 o = (java_objectheader *) ee;
426 exceptions_set_exception(o);
431 * Class: sun/misc/Unsafe
432 * Method: compareAndSwapObject
433 * Signature: (Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
435 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, java_lang_Object *expected, java_lang_Object *x)
440 p = (void **) (((uint8_t *) o) + offset);
442 /* XXX this should be atomic */
446 if (value == expected) {
457 * Class: sun/misc/Unsafe
458 * Method: compareAndSwapInt
459 * Signature: (Ljava/lang/Object;JII)Z
461 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, sun_misc_Unsafe* this, java_lang_Object* obj, int64_t offset, int32_t expect, int32_t update)
466 p = (int32_t *) (((uint8_t *) obj) + offset);
468 /* XXX this should be atomic */
472 if (value == expect) {
483 * Class: sun/misc/Unsafe
484 * Method: compareAndSwapLong
485 * Signature: (Ljava/lang/Object;JJJ)Z
487 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int64_t expected, int64_t x)
492 p = (int64_t *) (((uint8_t *) o) + offset);
494 /* XXX this should be atomic */
498 if (value == expected) {
509 * Class: sun/misc/Unsafe
510 * Method: getObjectVolatile
511 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
513 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
516 volatile void *value;
518 p = (volatile void **) (((uint8_t *) o) + offset);
522 return (java_lang_Object *) value;
527 * Class: sun/misc/Unsafe
528 * Method: getIntVolatile
529 * Signature: (Ljava/lang/Object;J)I
531 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
534 volatile int32_t value;
536 p = (volatile int32_t *) (((uint8_t *) o) + offset);
545 * These are local overrides for various environment variables in Emacs.
546 * Please do not remove this and leave it at the end of the file, where
547 * Emacs will automagically detect them.
548 * ---------------------------------------------------------------------
551 * indent-tabs-mode: t