Etienne Gagnon wrote:
> Hi Weldon,
>
> I've started reading about the VMI. While my initial goal would be to
> get SableVM to work with Harmony as a drop-in replacement for IBM's VM,
> I have some questions about some assumptions of the VMI.
>
> In particular, I would like to understand the motivation for the
> implicit direct link from the hyluni library to the VM library. In
> other words, it seems logical to me that the VM library would cause the
> dynamic loading of the hyluni library.
Right, in the IBM VME world, the VM explicitly loads the hyluni.dll and
ICUInterface34.dll (a dependent DLL containing char functions used via
String).
> On the other hand, I don't
> understand why the hyluni library assumes that it will be necessarily
> loaded by a specific VM library sitting in a particular directory.
It doesn't. The hyluni library code uses macros that expand out to a
function table maintained by the VMStruct as you elude to below.
So you will see code everywhere like this [1]:
jboolean JNICALL
Java_java_io_File_existsImpl
(JNIEnv * env, jobject recv, jbyteArray path)
{
PORT_ACCESS_FROM_ENV (env);
...
}
Where PORT_ACCESS_FROM_ENV is a macro that expands out as follows [2]:
#define PORT_ACCESS_FROM_ENV(jniEnv) \
HyPortLibrary *privatePortLibrary = \
((HyVMThread *) (jniEnv))->javaVM->portLibrary
The portlibray is itself a function pointer table that contains
functions used in the JNI code.
> This assumption has an important side effect. The hyluni library
> assumes that it can simply call VMI_* global functions which are
> resolved by the dynamic linker.
The only functions that are exported by the VM are [3]
VMInterface* JNICALL VMI_GetVMIFromJNIEnv(JNIEnv* env)
VMInterface* JNICALL VMI_GetVMIFromJavaVM(JavaVM* vm)
The remaining VMI functions are looked-up in a function table [4] in a
similar fashion to the portlib code, so for example [5]:
jint JNICALL
Java_java_util_zip_ZipFile_openZipImpl (JNIEnv * env, jobject recv,
jbyteArray zipName)
{
VMI_ACCESS_FROM_ENV (env);
PORT_ACCESS_FROM_ENV (env);
...
zipCachePool = (*VMI)->GetZipCachePool (VMI);
...
}
> Personally, I would have done things
> some other way; I would either have had the VM library call a
> VMI_SetVMI() function exported by the hyluni library and requested the
> the VM library call it, or, better, I would have done like the debug
> interface and requested the VMI function table through the GetEnv
> function of the invocation interface :
>
> (*jvm)->GetEnv(jvm, &vmi, VMI_VERSION_1);
>
> This would seem the cleanest approach to me.
That is the moral equivalent of what we have done, as shown above.
> The only problem is to
> avoid clashing with Sun's constants.
>
> The problem I see, with the current approach, is that it makes it
> impossible to provide distinct VM libraries for different purposes
> (debugging, faster execution, profiling, ...), as they can't be all in a
> single file.
We want that too, and I believe that it is already possible.
Regards,
Tim
Refs:
[1]
http://svn.apache.org/viewcvs.cgi/incubator/harmony/enhanced/classlib/trunk/native-src/shared/luni/file.c?view=markup
[2]
http://svn.apache.org/viewcvs.cgi/incubator/harmony/enhanced/classlib/trunk/native-src/shared/include/hyport.h?view=markup
[3]
http://svn.apache.org/viewcvs.cgi/incubator/harmony/enhanced/classlib/trunk/native-src/shared/vmi/vmi.c?view=markup
[4]
http://svn.apache.org/viewcvs.cgi/incubator/harmony/enhanced/classlib/trunk/native-src/shared/include/vmi.h?view=markup
[5]
http://svn.apache.org/viewcvs.cgi/incubator/harmony/enhanced/classlib/trunk/native-src/shared/archive/zip.c?view=markup
> Etienne
>
> Weldon Washburn wrote:
>> ... In any case, feel free to borrow parts of kernel_path that
>> make sense. Also, feel free to ask questions about it.
>
--
Tim Ellison ([EMAIL PROTECTED])
IBM Java technology centre, UK.