summaryrefslogtreecommitdiffstats
path: root/src/com/mbien/opencl/InternalBufferUtil.java
diff options
context:
space:
mode:
authorMichael Bien <[email protected]>2010-01-20 20:39:33 +0100
committerMichael Bien <[email protected]>2010-01-20 20:39:33 +0100
commitc9e1605e183d7e83af16dc8fac057e58cfc2d29b (patch)
tree61322e181ac79d4e9d733de23b2784fb686ca902 /src/com/mbien/opencl/InternalBufferUtil.java
parent21f0d9231227a4d2c96cb70b5061c18145591fba (diff)
seperated CLProgram specific tests into CLProgramTest.
implemented create-program-from-binaries functionality. javadoc fixes.
Diffstat (limited to 'src/com/mbien/opencl/InternalBufferUtil.java')
-rw-r--r--src/com/mbien/opencl/InternalBufferUtil.java39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/com/mbien/opencl/InternalBufferUtil.java b/src/com/mbien/opencl/InternalBufferUtil.java
new file mode 100644
index 00000000..a2573784
--- /dev/null
+++ b/src/com/mbien/opencl/InternalBufferUtil.java
@@ -0,0 +1,39 @@
+package com.mbien.opencl;
+
+import java.lang.reflect.Field;
+import java.nio.Buffer;
+import sun.misc.Unsafe;
+
+/**
+ *
+ * @author Michael Bien
+ */
+class InternalBufferUtil {
+
+ private static final long addressFieldOffset;
+ private static Unsafe unsafe;
+
+ static {
+ try {
+ Field f = Buffer.class.getDeclaredField("address");
+
+ Field[] fields = Unsafe.class.getDeclaredFields();
+ for (int i = 0; i < fields.length; i++) {
+ if (fields[i].getName().equals("theUnsafe")) {
+ fields[i].setAccessible(true);
+ unsafe = (Unsafe)fields[i].get(Unsafe.class);
+ break;
+ }
+ }
+
+ addressFieldOffset = unsafe.objectFieldOffset(f);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static long getDirectBufferAddress(Buffer buffer) {
+ return ((buffer == null) ? 0 : unsafe.getLong(buffer, addressFieldOffset));
+ }
+
+} \ No newline at end of file