Prerequisite: each component carries its own helpers (which means no
"allocation helper" in VM Core, for example).

Yes, simple JIT will call helper as regular JNI method.

I missed several issues in my original message.

First: "how to get address of helper?"
Answer:
Two choices:
1) each component must provide "static native long getHelperAddress(int)" in
its helper class. JIT will make a call to this function as regular JNICALL
(stdcall on Windows, cdecl on Linux). Function prototype can be typedef'ed
as "typedef (JNICALL*)(JNIEnv*, jint)". The issue I see here is naming: each
component has its own helpers class name. So, the name for native method to
call will be <package name>_<class name>_getHelperAddress.
2) add regular (OPEN) interface function to each component which will
provide such mapping (as it is now done by VM).

Second: "what should be passed as JNIEnv to getHelperAddress?"
Answer:
NULL. Component should not use JNIEnv pointer in this call.

Third: "how to retrieve helpers class for a particular component?"
Answer:
Two choices again:
1) component modifies boot class path on initialization and exports
<component type>.helpers_class system property. Then VM loads this class and
JIT uses this class' name to retrieve fast path helpers.
2) component exports <component type>.helpers_jar system property on
initialization, then VM adds this JAR to boot class path, extracts the
manifest from it, retrieve Helpers-Class attribute from the manifest, and
exports it as <component type>.helpers_class. Then VM loads this class and
JIT uses this class' name to retrieve fast path helpers.
I, personally, prefer second choice here.

Anything else?..

Pavel.

On 10/20/06, Alex Astapchuk <[EMAIL PROTECTED]> wrote:

Pavel Pervov :
> My alternative follows:
>
> 1) Each component which exports magics, provides JAR file with class
> implementing these magics. Class name is described in (e.g.) Main-Class
> attribute of JAR's manifest.
> 2) The class contains java fast path for helper, and a pair of native
> methods: one for fast-slow path, and one for slow-slow path.
> 3) Fast-slow path helper can have any (supported) calling convention.


> 4) Slow-slow path helper will be called through JNI - it is regular
native
> method.
...
> way and generate call to slow_alloc in annotated calling convention.
If JIT
> does not support magics at all, it'll call jni_alloc in usual way - as
> regular call to native Java method.


Helpers are neither called as JNI methods nor they are called through
the JNI.

Or do you propose to make a code for the helpers as the JNI methods?
How would the 'jni_alloc(Address class, int size);' look like in the C
code?



--
Thanks,
  Alex



>
> The example follows:
> ----------------------
> package org.apache.harmony.vm.helpers;
> // Annotations follow here, which describe which method is which helper,
> // and which is fast-path, fast-slow path, slow-slow path
> class GCv6Helpers {
>    // fast-path allocation here
>    public static Address alloc(Address class, int size) {
>        // ...
>    }
>    // annotation, describing calling convention for fast-slow path
>    public static native Address slow_alloc(Address class, int size);
>    public static native Address jni_alloc(Address class, int size);
> }
>
> Now, if JIT supports magics, it'll process GCv6Magics::alloc in a
special
> way and generate call to slow_alloc in annotated calling convention. If
JIT
> does not support magics at all, it'll call jni_alloc in usual way - as
> regular call to native Java method.
>
> Yes, my idea suggests to change helper retrieval interface for JIT, but
we
> already started to make significant changes to architecture - let's just
> make them more generic.
>
> Regards,
>    Pavel.
>
> P.S. IMHO, this approach combines strong sides of Mikhail's and Pavel's
> ideas, as it use standard mechanisms of resolution and search of methods
in
> loaded classes.
>
> On 10/20/06, Mikhail Fursov <[EMAIL PROTECTED]> wrote:
>>
>> Yes, this thread is not about JNI. I'll start another thread related to
>> JNI
>> calls from VM components.
>>
>> BTW here is another solution how to find an address of the direct
native
>> method.
>> May be it's not the best, but it does not requires any calls from JIT
>> during
>> the compilation (neither Java nor VM calls)
>>
>> class IHaveNatives {
>>    public static final long myNativeAddress =
jni_getAddress("myNative")
>>
>>    // call to be replaced with direct native call
>>    public static void myNative() {throws new RuntimeException("not
>> implemented")};
>>
>>   // the way to obtain an address for a method
>>   private static native jni_getAddress(String directNativeCallName);
>> }
>>
>>
>> Solution: To find an address of the native call JIT can access to the
>> final
>> variable.
>>
>> On 10/20/06, Alex Astapchuk <[EMAIL PROTECTED]> wrote:
>> >
>> > Gregory,
>> >
>> > Gregory Shimansky:
>> > > On Thursday 19 October 2006 09:21 Alex Astapchuk wrote:
>> > >> Mikhail Fursov wrote:
>> > >>> On 10/19/06, Alex Astapchuk <[EMAIL PROTECTED]> wrote:
>> > >>>> Pavel,
>> > >>>>
>> > >>>> One more note.
>> > >>>>
>> > >>>>> b) About call of java method during compilation time. Jit now
>> make
>> > >>>> class loading during compilation.
>> > >>>>
>> > >>>>> It means that Jit make call of java method.
>> > >>>>> So I don't think that it's the other case.
>> > >>>> It is different.
>> > >>>> The JIT itself does not call Java code.
>> > >>>> All what JIT does is calling VM's resolve_{anything}. It's VM
who
>> may
>> > >>>> execute the Java code during the resolution.
>> > >>>>
>> > >>>> The JIT itself neither has a way to call an arbitrary Java
method
>> > during
>> > >>>> the compilation, neither has an access to JNI functionality.
>> > >>> Sounds reasonable. And this solution joins mine and Pavel's
>> proposals:
>> > >>> JIT calls a VM method to resolve native address for direct call.
>> JIT
>> > does
>> > >>> not
>> > >> I would also add that we can not use any Java-based resolution
>> schemes
>> > >> at all.
>> > >> (Here I mean anything that implies execution of managed code
during
>> > >> compilation in order to resolve the things).
>> > >>
>> > >> Doing so we would dig a huuuuge grave for ourselves: we'll get a
>> number
>> > >> of dead lock issues, as such a scheme will add a sporadic and
random
>> > >> locks inside a normal Java control flow. Exactly the same issue
>> as we
>> > >> had with mixing native and Java locks in the same control flow.
>> > >
>> > > I didn't read the beginning of this thread (it is huge!) so
>> forgive my
>> >
>> > Well, ok, here is its content in short: in previous series of the
>> thread
>> > we were talking about a very special native methods. It has nothing
to
>> > do with regular Java or JNI methods.
>> >
>> > > ignorance. Do you mean normal Java method resolution which is done
>> for
>> > all
>> > > methods native and Java, or do you mean some special "native helper
>> > address
>> > > resolution" where you a priori know that method is native and
normal
>> > Java
>> > > resolution was successfully done for it already?
>> > >
>> > > I think in this case "native helper address resolution" would not
>> > perform any
>> > > Java calls, it would be a simple lookup through native libraries
>> loaded
>> > by
>> >
>> > Pavel's proposal was *to perform* the Java or JNI call.
>> >
>> > > the class loader which was used to load the class which owns the
>> method
>> > where
>> > > you want to inline a helper.
>> >
>> > The helpers we are talking about may have nothing to do neither with
>> > ClassLoading machinery, nor with a libraries already loaded by Java.
>> >
>> >
>> > --
>> > Thanks,
>> >    Alex
>> >
>> >
>> > ---------------------------------------------------------------------
>> > Terms of use : http://incubator.apache.org/harmony/mailing.html
>> > To unsubscribe, e-mail: [EMAIL PROTECTED]
>> > For additional commands, e-mail:
[EMAIL PROTECTED]
>> >
>> >
>>
>>
>> --
>> Mikhail Fursov
>>
>>
>




---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


Reply via email to