// Path: ohc-core/src/main/java/org/caffinitas/ohc/alloc/IAllocator.java
// public interface IAllocator
// {
//     long allocate(long size);
//     void free(long peer);
//     long getTotalAllocated();
// }
// 
// Path: ohc-core/src/main/java/org/caffinitas/ohc/alloc/JNANativeAllocator.java
// public final class JNANativeAllocator implements IAllocator
// {
//     public long allocate(long size)
//     {
//         try
//         {
//             return Native.malloc(size);
//         }
//         catch (OutOfMemoryError oom)
//         {
//             return 0L;
//         }
//     }
// 
//     public void free(long peer)
//     {
//         Native.free(peer);
//     }
// 
//     public long getTotalAllocated()
//     {
//         return -1L;
//     }
// }
// 
// Path: ohc-core/src/main/java/org/caffinitas/ohc/alloc/UnsafeAllocator.java
// public final class UnsafeAllocator implements IAllocator
// {
//     static final Unsafe unsafe;
// 
//     static
//     {
//         try
//         {
//             Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
//             field.setAccessible(true);
//             unsafe = (sun.misc.Unsafe) field.get(null);
//         }
//         catch (Exception e)
//         {
//             throw new AssertionError(e);
//         }
//     }
// 
//     public long allocate(long size)
//     {
//         try
//         {
//             return unsafe.allocateMemory(size);
//         }
//         catch (OutOfMemoryError oom)
//         {
//             return 0L;
//         }
//     }
// 
//     public void free(long peer)
//     {
//         unsafe.freeMemory(peer);
//     }
// 
//     public long getTotalAllocated()
//     {
//         return -1L;
//     }
// }


import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.caffinitas.ohc.alloc.IAllocator;
import org.caffinitas.ohc.alloc.JNANativeAllocator;
import org.caffinitas.ohc.alloc.UnsafeAllocator;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
                if (adr.compareAndSet(a, 0L))
                {
                    allocator.free(a);
                    break;
                }
            }

            long a = allocator.allocate(size);
            if (!adr.compareAndSet(0L, a))
            {
                allocator.free(a);
            }
        }

        void freeAll(IAllocator allocator)
        {
            for (AtomicLong al : adrs)
            {
                long adr = al.get();
                if (adr != 0L)
                    allocator.free(adr);
            }
        }
    }

    @Setup
    public void createAllocator()
    {
        switch (allocatorType)
        {
// Path: ohc-core/src/main/java/org/caffinitas/ohc/alloc/IAllocator.java
// public interface IAllocator
// {
//     long allocate(long size);
//     void free(long peer);
//     long getTotalAllocated();
// }
// 
// Path: ohc-core/src/main/java/org/caffinitas/ohc/alloc/JNANativeAllocator.java
// public final class JNANativeAllocator implements IAllocator
// {
//     public long allocate(long size)
//     {
//         try
//         {
//             return Native.malloc(size);
//         }
//         catch (OutOfMemoryError oom)
//         {
//             return 0L;
//         }
//     }
// 
//     public void free(long peer)
//     {
//         Native.free(peer);
//     }
// 
//     public long getTotalAllocated()
//     {
//         return -1L;
//     }
// }
// 
// Path: ohc-core/src/main/java/org/caffinitas/ohc/alloc/UnsafeAllocator.java
// public final class UnsafeAllocator implements IAllocator
// {
//     static final Unsafe unsafe;
// 
//     static
//     {
//         try
//         {
//             Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
//             field.setAccessible(true);
//             unsafe = (sun.misc.Unsafe) field.get(null);
//         }
//         catch (Exception e)
//         {
//             throw new AssertionError(e);
//         }
//     }
// 
//     public long allocate(long size)
//     {
//         try
//         {
//             return unsafe.allocateMemory(size);
//         }
//         catch (OutOfMemoryError oom)
//         {
//             return 0L;
//         }
//     }
// 
//     public void free(long peer)
//     {
//         unsafe.freeMemory(peer);
//     }
// 
//     public long getTotalAllocated()
//     {
//         return -1L;
//     }
// }


// Path: ohc-jmh/src/main/java/org/caffinitas/ohc/jmh/AllocatorBenchmark.java
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.caffinitas.ohc.alloc.IAllocator;
import org.caffinitas.ohc.alloc.JNANativeAllocator;
import org.caffinitas.ohc.alloc.UnsafeAllocator;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;

                if (adr.compareAndSet(a, 0L))
                {
                    allocator.free(a);
                    break;
                }
            }

            long a = allocator.allocate(size);
            if (!adr.compareAndSet(0L, a))
            {
                allocator.free(a);
            }
        }

        void freeAll(IAllocator allocator)
        {
            for (AtomicLong al : adrs)
            {
                long adr = al.get();
                if (adr != 0L)
                    allocator.free(adr);
            }
        }
    }

    @Setup
    public void createAllocator()
    {
        switch (allocatorType)
        {
            case "Unsafe": allocator = new UnsafeAllocator(); break;