Merged with tip.
[cacao.git] / src / classes / gnu / sun / misc / Unsafe.java
1 /*
2  * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Sun designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Sun in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22  * CA 95054 USA or visit www.sun.com if you need additional information or
23  * have any questions.
24  */
25
26 package sun.misc;
27
28 import java.security.*;
29 import java.lang.reflect.*;
30
31
32 /**
33  * A collection of methods for performing low-level, unsafe operations.
34  * Although the class and all methods are public, use of this class is
35  * limited because only trusted code can obtain instances of it.
36  *
37  * @author John R. Rose
38  * @see #getUnsafe
39  */
40
41 public final class Unsafe {
42
43     private static native void registerNatives();
44     static {
45         registerNatives();
46 //        sun.reflect.Reflection.registerMethodsToFilter(Unsafe.class, "getUnsafe");
47     }
48
49     private Unsafe() {}
50
51     private static final Unsafe theUnsafe = new Unsafe();
52
53     /**
54      * Provides the caller with the capability of performing unsafe
55      * operations.
56      *
57      * <p> The returned <code>Unsafe</code> object should be carefully guarded
58      * by the caller, since it can be used to read and write data at arbitrary
59      * memory addresses.  It must never be passed to untrusted code.
60      *
61      * <p> Most methods in this class are very low-level, and correspond to a
62      * small number of hardware instructions (on typical machines).  Compilers
63      * are encouraged to optimize these methods accordingly.
64      *
65      * <p> Here is a suggested idiom for using unsafe operations:
66      *
67      * <blockquote><pre>
68      * class MyTrustedClass {
69      *   private static final Unsafe unsafe = Unsafe.getUnsafe();
70      *   ...
71      *   private long myCountAddress = ...;
72      *   public int getCount() { return unsafe.getByte(myCountAddress); }
73      * }
74      * </pre></blockquote>
75      *
76      * (It may assist compilers to make the local variable be
77      * <code>final</code>.)
78      *
79      * @exception  SecurityException  if a security manager exists and its
80      *             <code>checkPropertiesAccess</code> method doesn't allow
81      *             access to the system properties.
82      */
83     public static Unsafe getUnsafe() {
84         Class cc = sun.reflect.Reflection.getCallerClass(2);
85         if (cc.getClassLoader() != null)
86             throw new SecurityException("Unsafe");
87         return theUnsafe;
88     }
89
90     /// peek and poke operations
91     /// (compilers should optimize these to memory ops)
92
93     // These work on object fields in the Java heap.
94     // They will not work on elements of packed arrays.
95
96     /**
97      * Fetches a value from a given Java variable.
98      * More specifically, fetches a field or array element within the given
99      * object <code>o</code> at the given offset, or (if <code>o</code> is
100      * null) from the memory address whose numerical value is the given
101      * offset.
102      * <p>
103      * The results are undefined unless one of the following cases is true:
104      * <ul>
105      * <li>The offset was obtained from {@link #objectFieldOffset} on
106      * the {@link java.lang.reflect.Field} of some Java field and the object
107      * referred to by <code>o</code> is of a class compatible with that
108      * field's class.
109      *
110      * <li>The offset and object reference <code>o</code> (either null or
111      * non-null) were both obtained via {@link #staticFieldOffset}
112      * and {@link #staticFieldBase} (respectively) from the
113      * reflective {@link Field} representation of some Java field.
114      *
115      * <li>The object referred to by <code>o</code> is an array, and the offset
116      * is an integer of the form <code>B+N*S</code>, where <code>N</code> is
117      * a valid index into the array, and <code>B</code> and <code>S</code> are
118      * the values obtained by {@link #arrayBaseOffset} and {@link
119      * #arrayIndexScale} (respectively) from the array's class.  The value
120      * referred to is the <code>N</code><em>th</em> element of the array.
121      *
122      * </ul>
123      * <p>
124      * If one of the above cases is true, the call references a specific Java
125      * variable (field or array element).  However, the results are undefined
126      * if that variable is not in fact of the type returned by this method.
127      * <p>
128      * This method refers to a variable by means of two parameters, and so
129      * it provides (in effect) a <em>double-register</em> addressing mode
130      * for Java variables.  When the object reference is null, this method
131      * uses its offset as an absolute address.  This is similar in operation
132      * to methods such as {@link #getInt(long)}, which provide (in effect) a
133      * <em>single-register</em> addressing mode for non-Java variables.
134      * However, because Java variables may have a different layout in memory
135      * from non-Java variables, programmers should not assume that these
136      * two addressing modes are ever equivalent.  Also, programmers should
137      * remember that offsets from the double-register addressing mode cannot
138      * be portably confused with longs used in the single-register addressing
139      * mode.
140      *
141      * @param o Java heap object in which the variable resides, if any, else
142      *        null
143      * @param offset indication of where the variable resides in a Java heap
144      *        object, if any, else a memory address locating the variable
145      *        statically
146      * @return the value fetched from the indicated Java variable
147      * @throws RuntimeException No defined exceptions are thrown, not even
148      *         {@link NullPointerException}
149      */
150     public native int getInt(Object o, long offset);
151
152     /**
153      * Stores a value into a given Java variable.
154      * <p>
155      * The first two parameters are interpreted exactly as with
156      * {@link #getInt(Object, long)} to refer to a specific
157      * Java variable (field or array element).  The given value
158      * is stored into that variable.
159      * <p>
160      * The variable must be of the same type as the method
161      * parameter <code>x</code>.
162      *
163      * @param o Java heap object in which the variable resides, if any, else
164      *        null
165      * @param offset indication of where the variable resides in a Java heap
166      *        object, if any, else a memory address locating the variable
167      *        statically
168      * @param x the value to store into the indicated Java variable
169      * @throws RuntimeException No defined exceptions are thrown, not even
170      *         {@link NullPointerException}
171      */
172     public native void putInt(Object o, long offset, int x);
173
174     /**
175      * Fetches a reference value from a given Java variable.
176      * @see #getInt(Object, long)
177      */
178     public native Object getObject(Object o, long offset);
179
180     /**
181      * Stores a reference value into a given Java variable.
182      * <p>
183      * Unless the reference <code>x</code> being stored is either null
184      * or matches the field type, the results are undefined.
185      * If the reference <code>o</code> is non-null, car marks or
186      * other store barriers for that object (if the VM requires them)
187      * are updated.
188      * @see #putInt(Object, int, int)
189      */
190     public native void putObject(Object o, long offset, Object x);
191
192     /** @see #getInt(Object, long) */
193     public native boolean getBoolean(Object o, long offset);
194     /** @see #putInt(Object, int, int) */
195     public native void    putBoolean(Object o, long offset, boolean x);
196     /** @see #getInt(Object, long) */
197     public native byte    getByte(Object o, long offset);
198     /** @see #putInt(Object, int, int) */
199     public native void    putByte(Object o, long offset, byte x);
200     /** @see #getInt(Object, long) */
201     public native short   getShort(Object o, long offset);
202     /** @see #putInt(Object, int, int) */
203     public native void    putShort(Object o, long offset, short x);
204     /** @see #getInt(Object, long) */
205     public native char    getChar(Object o, long offset);
206     /** @see #putInt(Object, int, int) */
207     public native void    putChar(Object o, long offset, char x);
208     /** @see #getInt(Object, long) */
209     public native long    getLong(Object o, long offset);
210     /** @see #putInt(Object, int, int) */
211     public native void    putLong(Object o, long offset, long x);
212     /** @see #getInt(Object, long) */
213     public native float   getFloat(Object o, long offset);
214     /** @see #putInt(Object, int, int) */
215     public native void    putFloat(Object o, long offset, float x);
216     /** @see #getInt(Object, long) */
217     public native double  getDouble(Object o, long offset);
218     /** @see #putInt(Object, int, int) */
219     public native void    putDouble(Object o, long offset, double x);
220
221     /**
222      * This method, like all others with 32-bit offsets, was native
223      * in a previous release but is now a wrapper which simply casts
224      * the offset to a long value.  It provides backward compatibility
225      * with bytecodes compiled against 1.4.
226      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
227      * See {@link #staticFieldOffset}.
228      */
229     @Deprecated
230     public int getInt(Object o, int offset) {
231         return getInt(o, (long)offset);
232     }
233
234     /**
235      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
236      * See {@link #staticFieldOffset}.
237      */
238     @Deprecated
239     public void putInt(Object o, int offset, int x) {
240         putInt(o, (long)offset, x);
241     }
242
243     /**
244      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
245      * See {@link #staticFieldOffset}.
246      */
247     @Deprecated
248     public Object getObject(Object o, int offset) {
249         return getObject(o, (long)offset);
250     }
251
252     /**
253      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
254      * See {@link #staticFieldOffset}.
255      */
256     @Deprecated
257     public void putObject(Object o, int offset, Object x) {
258         putObject(o, (long)offset, x);
259     }
260
261     /**
262      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
263      * See {@link #staticFieldOffset}.
264      */
265     @Deprecated
266     public boolean getBoolean(Object o, int offset) {
267         return getBoolean(o, (long)offset);
268     }
269
270     /**
271      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
272      * See {@link #staticFieldOffset}.
273      */
274     @Deprecated
275     public void putBoolean(Object o, int offset, boolean x) {
276         putBoolean(o, (long)offset, x);
277     }
278
279     /**
280      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
281      * See {@link #staticFieldOffset}.
282      */
283     @Deprecated
284     public byte getByte(Object o, int offset) {
285         return getByte(o, (long)offset);
286     }
287
288     /**
289      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
290      * See {@link #staticFieldOffset}.
291      */
292     @Deprecated
293     public void putByte(Object o, int offset, byte x) {
294         putByte(o, (long)offset, x);
295     }
296
297     /**
298      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
299      * See {@link #staticFieldOffset}.
300      */
301     @Deprecated
302     public short getShort(Object o, int offset) {
303         return getShort(o, (long)offset);
304     }
305
306     /**
307      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
308      * See {@link #staticFieldOffset}.
309      */
310     @Deprecated
311     public void putShort(Object o, int offset, short x) {
312         putShort(o, (long)offset, x);
313     }
314
315     /**
316      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
317      * See {@link #staticFieldOffset}.
318      */
319     @Deprecated
320     public char getChar(Object o, int offset) {
321         return getChar(o, (long)offset);
322     }
323
324     /**
325      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
326      * See {@link #staticFieldOffset}.
327      */
328     @Deprecated
329     public void putChar(Object o, int offset, char x) {
330         putChar(o, (long)offset, x);
331     }
332
333     /**
334      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
335      * See {@link #staticFieldOffset}.
336      */
337     @Deprecated
338     public long getLong(Object o, int offset) {
339         return getLong(o, (long)offset);
340     }
341
342     /**
343      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
344      * See {@link #staticFieldOffset}.
345      */
346     @Deprecated
347     public void putLong(Object o, int offset, long x) {
348         putLong(o, (long)offset, x);
349     }
350
351     /**
352      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
353      * See {@link #staticFieldOffset}.
354      */
355     @Deprecated
356     public float getFloat(Object o, int offset) {
357         return getFloat(o, (long)offset);
358     }
359
360     /**
361      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
362      * See {@link #staticFieldOffset}.
363      */
364     @Deprecated
365     public void putFloat(Object o, int offset, float x) {
366         putFloat(o, (long)offset, x);
367     }
368
369     /**
370      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
371      * See {@link #staticFieldOffset}.
372      */
373     @Deprecated
374     public double getDouble(Object o, int offset) {
375         return getDouble(o, (long)offset);
376     }
377
378     /**
379      * @deprecated As of 1.4.1, cast the 32-bit offset argument to a long.
380      * See {@link #staticFieldOffset}.
381      */
382     @Deprecated
383     public void putDouble(Object o, int offset, double x) {
384         putDouble(o, (long)offset, x);
385     }
386
387     // These work on values in the C heap.
388
389     /**
390      * Fetches a value from a given memory address.  If the address is zero, or
391      * does not point into a block obtained from {@link #allocateMemory}, the
392      * results are undefined.
393      *
394      * @see #allocateMemory
395      */
396     public native byte    getByte(long address);
397
398     /**
399      * Stores a value into a given memory address.  If the address is zero, or
400      * does not point into a block obtained from {@link #allocateMemory}, the
401      * results are undefined.
402      *
403      * @see #getByte(long)
404      */
405     public native void    putByte(long address, byte x);
406
407     /** @see #getByte(long) */
408     public native short   getShort(long address);
409     /** @see #putByte(long, byte) */
410     public native void    putShort(long address, short x);
411     /** @see #getByte(long) */
412     public native char    getChar(long address);
413     /** @see #putByte(long, byte) */
414     public native void    putChar(long address, char x);
415     /** @see #getByte(long) */
416     public native int     getInt(long address);
417     /** @see #putByte(long, byte) */
418     public native void    putInt(long address, int x);
419     /** @see #getByte(long) */
420     public native long    getLong(long address);
421     /** @see #putByte(long, byte) */
422     public native void    putLong(long address, long x);
423     /** @see #getByte(long) */
424     public native float   getFloat(long address);
425     /** @see #putByte(long, byte) */
426     public native void    putFloat(long address, float x);
427     /** @see #getByte(long) */
428     public native double  getDouble(long address);
429     /** @see #putByte(long, byte) */
430     public native void    putDouble(long address, double x);
431
432     /**
433      * Fetches a native pointer from a given memory address.  If the address is
434      * zero, or does not point into a block obtained from {@link
435      * #allocateMemory}, the results are undefined.
436      *
437      * <p> If the native pointer is less than 64 bits wide, it is extended as
438      * an unsigned number to a Java long.  The pointer may be indexed by any
439      * given byte offset, simply by adding that offset (as a simple integer) to
440      * the long representing the pointer.  The number of bytes actually read
441      * from the target address maybe determined by consulting {@link
442      * #addressSize}.
443      *
444      * @see #allocateMemory
445      */
446     public native long getAddress(long address);
447
448     /**
449      * Stores a native pointer into a given memory address.  If the address is
450      * zero, or does not point into a block obtained from {@link
451      * #allocateMemory}, the results are undefined.
452      *
453      * <p> The number of bytes actually written at the target address maybe
454      * determined by consulting {@link #addressSize}.
455      *
456      * @see #getAddress(long)
457      */
458     public native void putAddress(long address, long x);
459
460     /// wrappers for malloc, realloc, free:
461
462     /**
463      * Allocates a new block of native memory, of the given size in bytes.  The
464      * contents of the memory are uninitialized; they will generally be
465      * garbage.  The resulting native pointer will never be zero, and will be
466      * aligned for all value types.  Dispose of this memory by calling {@link
467      * #freeMemory}, or resize it with {@link #reallocateMemory}.
468      *
469      * @throws IllegalArgumentException if the size is negative or too large
470      *         for the native size_t type
471      *
472      * @throws OutOfMemoryError if the allocation is refused by the system
473      *
474      * @see #getByte(long)
475      * @see #putByte(long, byte)
476      */
477     public native long allocateMemory(long bytes);
478
479     /**
480      * Resizes a new block of native memory, to the given size in bytes.  The
481      * contents of the new block past the size of the old block are
482      * uninitialized; they will generally be garbage.  The resulting native
483      * pointer will be zero if and only if the requested size is zero.  The
484      * resulting native pointer will be aligned for all value types.  Dispose
485      * of this memory by calling {@link #freeMemory}, or resize it with {@link
486      * #reallocateMemory}.  The address passed to this method may be null, in
487      * which case an allocation will be performed.
488      *
489      * @throws IllegalArgumentException if the size is negative or too large
490      *         for the native size_t type
491      *
492      * @throws OutOfMemoryError if the allocation is refused by the system
493      *
494      * @see #allocateMemory
495      */
496     public native long reallocateMemory(long address, long bytes);
497
498     /**
499      * Sets all bytes in a given block of memory to a fixed value
500      * (usually zero).
501      */
502     public native void setMemory(long address, long bytes, byte value);
503
504     /**
505      * Sets all bytes in a given block of memory to a copy of another
506      * block.
507      */
508     public native void copyMemory(long srcAddress, long destAddress,
509                                   long bytes);
510
511     /**
512      * Disposes of a block of native memory, as obtained from {@link
513      * #allocateMemory} or {@link #reallocateMemory}.  The address passed to
514      * this method may be null, in which case no action is taken.
515      *
516      * @see #allocateMemory
517      */
518     public native void freeMemory(long address);
519
520     /// random queries
521
522     /**
523      * This constant differs from all results that will ever be returned from
524      * {@link #staticFieldOffset}, {@link #objectFieldOffset},
525      * or {@link #arrayBaseOffset}.
526      */
527     public static final int INVALID_FIELD_OFFSET   = -1;
528
529     /**
530      * Returns the offset of a field, truncated to 32 bits.
531      * This method is implemented as follows:
532      * <blockquote><pre>
533      * public int fieldOffset(Field f) {
534      *     if (Modifier.isStatic(f.getModifiers()))
535      *         return (int) staticFieldOffset(f);
536      *     else
537      *         return (int) objectFieldOffset(f);
538      * }
539      * </pre></blockquote>
540      * @deprecated As of 1.4.1, use {@link #staticFieldOffset} for static
541      * fields and {@link #objectFieldOffset} for non-static fields.
542      */
543     @Deprecated
544     public int fieldOffset(Field f) {
545         if (Modifier.isStatic(f.getModifiers()))
546             return (int) staticFieldOffset(f);
547         else
548             return (int) objectFieldOffset(f);
549     }
550
551     /**
552      * Returns the base address for accessing some static field
553      * in the given class.  This method is implemented as follows:
554      * <blockquote><pre>
555      * public Object staticFieldBase(Class c) {
556      *     Field[] fields = c.getDeclaredFields();
557      *     for (int i = 0; i < fields.length; i++) {
558      *         if (Modifier.isStatic(fields[i].getModifiers())) {
559      *             return staticFieldBase(fields[i]);
560      *         }
561      *     }
562      *     return null;
563      * }
564      * </pre></blockquote>
565      * @deprecated As of 1.4.1, use {@link #staticFieldBase(Field)}
566      * to obtain the base pertaining to a specific {@link Field}.
567      * This method works only for JVMs which store all statics
568      * for a given class in one place.
569      */
570     @Deprecated
571     public Object staticFieldBase(Class c) {
572         Field[] fields = c.getDeclaredFields();
573         for (int i = 0; i < fields.length; i++) {
574             if (Modifier.isStatic(fields[i].getModifiers())) {
575                 return staticFieldBase(fields[i]);
576             }
577         }
578         return null;
579     }
580
581     /**
582      * Report the location of a given field in the storage allocation of its
583      * class.  Do not expect to perform any sort of arithmetic on this offset;
584      * it is just a cookie which is passed to the unsafe heap memory accessors.
585      *
586      * <p>Any given field will always have the same offset and base, and no
587      * two distinct fields of the same class will ever have the same offset
588      * and base.
589      *
590      * <p>As of 1.4.1, offsets for fields are represented as long values,
591      * although the Sun JVM does not use the most significant 32 bits.
592      * However, JVM implementations which store static fields at absolute
593      * addresses can use long offsets and null base pointers to express
594      * the field locations in a form usable by {@link #getInt(Object,long)}.
595      * Therefore, code which will be ported to such JVMs on 64-bit platforms
596      * must preserve all bits of static field offsets.
597      * @see #getInt(Object, long)
598      */
599     public native long staticFieldOffset(Field f);
600
601     /**
602      * Report the location of a given static field, in conjunction with {@link
603      * #staticFieldBase}.
604      * <p>Do not expect to perform any sort of arithmetic on this offset;
605      * it is just a cookie which is passed to the unsafe heap memory accessors.
606      *
607      * <p>Any given field will always have the same offset, and no two distinct
608      * fields of the same class will ever have the same offset.
609      *
610      * <p>As of 1.4.1, offsets for fields are represented as long values,
611      * although the Sun JVM does not use the most significant 32 bits.
612      * It is hard to imagine a JVM technology which needs more than
613      * a few bits to encode an offset within a non-array object,
614      * However, for consistency with other methods in this class,
615      * this method reports its result as a long value.
616      * @see #getInt(Object, long)
617      */
618     public native long objectFieldOffset(Field f);
619
620     /**
621      * Report the location of a given static field, in conjunction with {@link
622      * #staticFieldOffset}.
623      * <p>Fetch the base "Object", if any, with which static fields of the
624      * given class can be accessed via methods like {@link #getInt(Object,
625      * long)}.  This value may be null.  This value may refer to an object
626      * which is a "cookie", not guaranteed to be a real Object, and it should
627      * not be used in any way except as argument to the get and put routines in
628      * this class.
629      */
630     public native Object staticFieldBase(Field f);
631
632     /**
633      * Ensure the given class has been initialized. This is often
634      * needed in conjunction with obtaining the static field base of a
635      * class.
636      */
637     public native void ensureClassInitialized(Class c);
638
639     /**
640      * Report the offset of the first element in the storage allocation of a
641      * given array class.  If {@link #arrayIndexScale} returns a non-zero value
642      * for the same class, you may use that scale factor, together with this
643      * base offset, to form new offsets to access elements of arrays of the
644      * given class.
645      *
646      * @see #getInt(Object, long)
647      * @see #putInt(Object, long, int)
648      */
649     public native int arrayBaseOffset(Class arrayClass);
650
651     /**
652      * Report the scale factor for addressing elements in the storage
653      * allocation of a given array class.  However, arrays of "narrow" types
654      * will generally not work properly with accessors like {@link
655      * #getByte(Object, int)}, so the scale factor for such classes is reported
656      * as zero.
657      *
658      * @see #arrayBaseOffset
659      * @see #getInt(Object, long)
660      * @see #putInt(Object, long, int)
661      */
662     public native int arrayIndexScale(Class arrayClass);
663
664     /**
665      * Report the size in bytes of a native pointer, as stored via {@link
666      * #putAddress}.  This value will be either 4 or 8.  Note that the sizes of
667      * other primitive types (as stored in native memory blocks) is determined
668      * fully by their information content.
669      */
670     public native int addressSize();
671
672     /**
673      * Report the size in bytes of a native memory page (whatever that is).
674      * This value will always be a power of two.
675      */
676     public native int pageSize();
677
678
679     /// random trusted operations from JNI:
680
681     /**
682      * Tell the VM to define a class, without security checks.  By default, the
683      * class loader and protection domain come from the caller's class.
684      */
685     public native Class defineClass(String name, byte[] b, int off, int len,
686                                     ClassLoader loader,
687                                     ProtectionDomain protectionDomain);
688
689     public native Class defineClass(String name, byte[] b, int off, int len);
690
691     /** Allocate an instance but do not run any constructor.
692         Initializes the class if it has not yet been. */
693     public native Object allocateInstance(Class cls)
694         throws InstantiationException;
695
696     /** Lock the object.  It must get unlocked via {@link #monitorExit}. */
697     public native void monitorEnter(Object o);
698
699     /**
700      * Unlock the object.  It must have been locked via {@link
701      * #monitorEnter}.
702      */
703     public native void monitorExit(Object o);
704
705     /**
706      * Tries to lock the object.  Returns true or false to indicate
707      * whether the lock succeeded.  If it did, the object must be
708      * unlocked via {@link #monitorExit}.
709      */
710     public native boolean tryMonitorEnter(Object o);
711
712     /** Throw the exception without telling the verifier. */
713     public native void throwException(Throwable ee);
714
715
716     /**
717      * Atomically update Java variable to <tt>x</tt> if it is currently
718      * holding <tt>expected</tt>.
719      * @return <tt>true</tt> if successful
720      */
721     public final native boolean compareAndSwapObject(Object o, long offset,
722                                                      Object expected,
723                                                      Object x);
724
725     /**
726      * Atomically update Java variable to <tt>x</tt> if it is currently
727      * holding <tt>expected</tt>.
728      * @return <tt>true</tt> if successful
729      */
730     public final native boolean compareAndSwapInt(Object o, long offset,
731                                                   int expected,
732                                                   int x);
733
734     /**
735      * Atomically update Java variable to <tt>x</tt> if it is currently
736      * holding <tt>expected</tt>.
737      * @return <tt>true</tt> if successful
738      */
739     public final native boolean compareAndSwapLong(Object o, long offset,
740                                                    long expected,
741                                                    long x);
742
743     /**
744      * Fetches a reference value from a given Java variable, with volatile
745      * load semantics. Otherwise identical to {@link #getObject(Object, long)}
746      */
747     public native Object getObjectVolatile(Object o, long offset);
748
749     /**
750      * Stores a reference value into a given Java variable, with
751      * volatile store semantics. Otherwise identical to {@link #putObject(Object, long, Object)}
752      */
753     public native void    putObjectVolatile(Object o, long offset, Object x);
754
755     /** Volatile version of {@link #getInt(Object, long)}  */
756     public native int     getIntVolatile(Object o, long offset);
757
758     /** Volatile version of {@link #putInt(Object, long, int)}  */
759     public native void    putIntVolatile(Object o, long offset, int x);
760
761     /** Volatile version of {@link #getBoolean(Object, long)}  */
762     public native boolean getBooleanVolatile(Object o, long offset);
763
764     /** Volatile version of {@link #putBoolean(Object, long, boolean)}  */
765     public native void    putBooleanVolatile(Object o, long offset, boolean x);
766
767     /** Volatile version of {@link #getByte(Object, long)}  */
768     public native byte    getByteVolatile(Object o, long offset);
769
770     /** Volatile version of {@link #putByte(Object, long, byte)}  */
771     public native void    putByteVolatile(Object o, long offset, byte x);
772
773     /** Volatile version of {@link #getShort(Object, long)}  */
774     public native short   getShortVolatile(Object o, long offset);
775
776     /** Volatile version of {@link #putShort(Object, long, short)}  */
777     public native void    putShortVolatile(Object o, long offset, short x);
778
779     /** Volatile version of {@link #getChar(Object, long)}  */
780     public native char    getCharVolatile(Object o, long offset);
781
782     /** Volatile version of {@link #putChar(Object, long, char)}  */
783     public native void    putCharVolatile(Object o, long offset, char x);
784
785     /** Volatile version of {@link #getLong(Object, long)}  */
786     public native long    getLongVolatile(Object o, long offset);
787
788     /** Volatile version of {@link #putLong(Object, long, long)}  */
789     public native void    putLongVolatile(Object o, long offset, long x);
790
791     /** Volatile version of {@link #getFloat(Object, long)}  */
792     public native float   getFloatVolatile(Object o, long offset);
793
794     /** Volatile version of {@link #putFloat(Object, long, float)}  */
795     public native void    putFloatVolatile(Object o, long offset, float x);
796
797     /** Volatile version of {@link #getDouble(Object, long)}  */
798     public native double  getDoubleVolatile(Object o, long offset);
799
800     /** Volatile version of {@link #putDouble(Object, long, double)}  */
801     public native void    putDoubleVolatile(Object o, long offset, double x);
802
803     /**
804      * Version of {@link #putObjectVolatile(Object, long, Object)}
805      * that does not guarantee immediate visibility of the store to
806      * other threads. This method is generally only useful if the
807      * underlying field is a Java volatile (or if an array cell, one
808      * that is otherwise only accessed using volatile accesses).
809      */
810     public native void    putOrderedObject(Object o, long offset, Object x);
811
812     /** Ordered/Lazy version of {@link #putIntVolatile(Object, long, int)}  */
813     public native void    putOrderedInt(Object o, long offset, int x);
814
815     /** Ordered/Lazy version of {@link #putLongVolatile(Object, long, long)} */
816     public native void    putOrderedLong(Object o, long offset, long x);
817
818     /**
819      * Unblock the given thread blocked on <tt>park</tt>, or, if it is
820      * not blocked, cause the subsequent call to <tt>park</tt> not to
821      * block.  Note: this operation is "unsafe" solely because the
822      * caller must somehow ensure that the thread has not been
823      * destroyed. Nothing special is usually required to ensure this
824      * when called from Java (in which there will ordinarily be a live
825      * reference to the thread) but this is not nearly-automatically
826      * so when calling from native code.
827      * @param thread the thread to unpark.
828      *
829      */
830     public native void unpark(Object thread);
831
832     /**
833      * Block current thread, returning when a balancing
834      * <tt>unpark</tt> occurs, or a balancing <tt>unpark</tt> has
835      * already occurred, or the thread is interrupted, or, if not
836      * absolute and time is not zero, the given time nanoseconds have
837      * elapsed, or if absolute, the given deadline in milliseconds
838      * since Epoch has passed, or spuriously (i.e., returning for no
839      * "reason"). Note: This operation is in the Unsafe class only
840      * because <tt>unpark</tt> is, so it would be strange to place it
841      * elsewhere.
842      */
843     public native void park(boolean isAbsolute, long time);
844
845     /**
846      * Gets the load average in the system run queue assigned
847      * to the available processors averaged over various periods of time.
848      * This method retrieves the given <tt>nelem</tt> samples and
849      * assigns to the elements of the given <tt>loadavg</tt> array.
850      * The system imposes a maximum of 3 samples, representing
851      * averages over the last 1,  5,  and  15 minutes, respectively.
852      *
853      * @params loadavg an array of double of size nelems
854      * @params nelems the number of samples to be retrieved and
855      *         must be 1 to 3.
856      *
857      * @return the number of samples actually retrieved; or -1
858      *         if the load average is unobtainable.
859      */
860     public native int getLoadAverage(double[] loadavg, int nelems);
861 }