changeset 13869:e2db5c351ef3

GNFI: cache lookup handles
author Matthias Grimmer <grimmer@ssw.jku.at>
date Wed, 05 Feb 2014 09:26:36 +0100
parents e30bae026c93
children d04be74665fb
files graal/com.oracle.graal.ffi.amd64/src/com/oracle/graal/ffi/amd64/AMD64NativeFunctionInterface.java
diffstat 1 files changed, 9 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.ffi.amd64/src/com/oracle/graal/ffi/amd64/AMD64NativeFunctionInterface.java	Wed Feb 05 09:24:23 2014 +0100
+++ b/graal/com.oracle.graal.ffi.amd64/src/com/oracle/graal/ffi/amd64/AMD64NativeFunctionInterface.java	Wed Feb 05 09:26:36 2014 +0100
@@ -45,6 +45,9 @@
     protected final AMD64NativeFunctionPointer libraryLoadFunctionPointer;
     protected final AMD64NativeFunctionPointer functionLookupFunctionPointer;
 
+    private AMD64NativeFunctionHandle libraryLookupFunctionHandle;
+    private AMD64NativeFunctionHandle dllLookupFunctionHandle;
+
     public AMD64NativeFunctionInterface(HotSpotProviders providers, Backend backend, AMD64NativeFunctionPointer libraryLoadFunctionPointer, AMD64NativeFunctionPointer functionLookUpFunctionPointer,
                     AMD64NativeLibraryHandle rtldDefault) {
         this.rtldDefault = rtldDefault;
@@ -56,8 +59,9 @@
 
     @Override
     public AMD64NativeLibraryHandle getLibraryHandle(String libPath) {
-        AMD64NativeFunctionHandle libraryLookupFunctionHandle = new AMD64NativeFunctionHandle(providers, backend, libraryLoadFunctionPointer, long.class,
-                        new Class[]{long.class, long.class, int.class});
+        if (libraryLookupFunctionHandle == null) {
+            libraryLookupFunctionHandle = new AMD64NativeFunctionHandle(providers, backend, libraryLoadFunctionPointer, long.class, new Class[]{long.class, long.class, int.class});
+        }
 
         long allocatedMemory = -1;
         try {
@@ -106,7 +110,9 @@
         if (!functionLookupFunctionPointer.isValid()) {
             throw new IllegalStateException("no dlsym function pointer");
         }
-        AMD64NativeFunctionHandle dllLookupFunctionHandle = new AMD64NativeFunctionHandle(providers, backend, functionLookupFunctionPointer, LOOKUP_FUNCTION_RETURNTYPE, LOOKUP_FUNCTION_SIGNATURE);
+        if (dllLookupFunctionHandle == null) {
+            dllLookupFunctionHandle = new AMD64NativeFunctionHandle(providers, backend, functionLookupFunctionPointer, LOOKUP_FUNCTION_RETURNTYPE, LOOKUP_FUNCTION_SIGNATURE);
+        }
         long allocatedMemory = copyStringToMemory(functionName);
         Object[] args = new Object[]{handle, allocatedMemory};
         long functionPointer = (long) dllLookupFunctionHandle.call(args);