/* %W% %E%
 * Copyright %G% Sun Microsystems, Inc.
 */

import sun.misc.Unsafe;
import java.lang.reflect.Field;

class ReallocateTest {

    public static void main (String args[]) {
        boolean passed = true;
        long address;
        long size;
        Unsafe unsafe = getUnsafe();

        try {
            size = 100;
            System.out.println("Allocating: " + size);
            address = unsafe.allocateMemory(100);
            System.out.println("  successful: " + address);
            size = 1_000_000_000;
            System.out.println("Re-allocating: " + size);
            address = unsafe.reallocateMemory(address, size);
            System.out.println("  successful: " + address);
            passed = false;
            System.out.println("Memory reallocated... OOM is expected here");
            unsafe.freeMemory(address);

            System.out.println("Allocating: " + size);
            address = unsafe.allocateMemory(size);
            System.out.println("  successful: " + address);
            System.out.println("Memory allocated... OOM is still expected here");
            unsafe.freeMemory(address);
        } catch (OutOfMemoryError e) {
            System.out.println("OOM: " + e);
        }

        System.out.println(passed ? "Test passed" : "Test failed");
    }

    public static Unsafe getUnsafe() {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);
            return (Unsafe)f.get(null);
        } catch (Exception e) {
            throw new Error("Cannot get unsfafe", e);
        }
    }
}
