Sorry guys, I've just found different problem at the very same place.

Nik.

On 10/11/06, Evgueni Brevnov <[EMAIL PROTECTED]> wrote:
Nikolay,

From what you said above I conclude that it is TM problem in respect
to how it manages non-daemon threads. Do you agree? If you don't
please start another thread with appropriate subject. It seems to be
out of current topic.

Evgueni

On 10/11/06, Nikolay Kuznetsov <[EMAIL PROTECTED]> wrote:
> Evgueni,
> > On 10/11/06, Nikolay Kuznetsov <[EMAIL PROTECTED]> wrote:
> > > I have a quick note about detaching current thread. I've filled
> > > HARMONY-1816 issue about counting non daemon threads. And concerning
> > > DetachCurrentThread we should either detach it
> >
> > I don't understand your concern.... what should we detach? Could you
> > give an example or test case?
>
> HARMONY-1816 contains such a test case, it hangs because child thread
> works a bit longer than main method. In this case  main method exits,
> but the main thread enters
> wait for all non daemon treads method. It checks that non daemon count
> >1, 1 stands for itself and enters while cycle with condition that
> non-daemon threads should be equal to zero, while the main thread also
> non-daemon.
>
> > > or rewrite
> > > wait_for_all_nondaemon threads to take into account the fact that main
> > > thread is also non daemon.
> >
> > First of all we should not do any assumption regarding main thread. It
> > doesn't differ from any other non daemon thread. It may die long
> > before last non daemon thread dies. DestroyJavaVM may be called by any
> > thread....even unattached...
>
> I agree, but the thread which counts non-daemon threads should take
> into account that it itself may also daemon or non-daemon and count
> other threads till 1 or 0 or detach(or countdown non-daemon threads)
> itself before waiting.
>
> Nik.
> >
> > Thanks Evgueni
> > >
> > > Nik.
> > > On 10/11/06, Evgueni Brevnov <[EMAIL PROTECTED]> wrote:
> > > > Oliver,
> > > >
> > > > I created https://issues.apache.org/jira/browse/HARMONY-1819 with
> > > > suggested fix. Please, look at and update it if DetachCurrentThread is
> > > > required before DestroyJavaVM for some reason.
> > > >
> > > > Thanks
> > > > Evgueni
> > > >
> > > > On 9/22/06, Evgueni Brevnov <[EMAIL PROTECTED]> wrote:
> > > > > On 9/22/06, Oliver Deakin <[EMAIL PROTECTED]> wrote:
> > > > > > Tim Ellison wrote:
> > > > > > > Still, it seems strange that you should have to call 
DetachCurrentThread
> > > > > > >  explicitly to get this behavior.  I would have expected that
> > > > > > > DestroyJavaVM alone would cause the uncaught exception handler to 
fire.
> > > > > > >  Not all apps that embed the VM will know to make this 
work-around.
> > > > > > >
> > > > > >
> > > > > > Yes, that surprised me too. The bug suggests that the launcher is at
> > > > > > fault for calling
> > > > > > ExceptionDescribe() instead of DetachCurrentThread(). However I 
would have
> > > > > > thought that this was not necessary in the case where an exception
> > > > > > handler has
> > > > > > been registered, and that the handler would be called during
> > > > > > DestroyJavaVM()'s
> > > > > > execution.
> > > > > >
> > > > > > Perhaps this is something that could be "fixed" in DRLVM? So if
> > > > > > DetachCurrentThread() is called, it runs any registered exception
> > > > > > handlers for that
> > > > > > thread as usual. However, if DestroyJavaVM is called, it makes sure 
that all
> > > > > > exception handlers are run for every thread.
> > > > > >
> > > > >
> > > > > Sure, I checked both cases work fine on my implementation of
> > > > > InvocationAPI for DRLVM (with DetachCurrentThread and without it). So
> > > > > the launcher can choose either to detach the main thread or not...
> > > > >
> > > > > Thanks
> > > > > Evgueni
> > > > >
> > > > > > Regards,
> > > > > > Oliver
> > > > > >
> > > > > > > Regards,
> > > > > > > Tim
> > > > > > >
> > > > > > > Oliver Deakin wrote:
> > > > > > >
> > > > > > >> Evgueni Brevnov wrote:
> > > > > > >>
> > > > > > >>> Oliver,
> > > > > > >>>
> > > > > > >>> Yes, I got the same result on RI when starting VM by your simple
> > > > > > >>> launcher. Assume it is OK not to print an error message and 
stacke
> > > > > > >>> trace of an unhandled exception in JavaDestroyVM(). How about 
calling
> > > > > > >>> uncaught exception handler? According to the spec it must be 
called if
> > > > > > >>> terminating thread has an exception. The test shows that the 
handler
> > > > > > >>> is not called when VM is created by our launcher.  But if VM is
> > > > > > >>> created by RI's launcher then everything works fine and the 
handler is
> > > > > > >>> executed. This means that RI's launcher somehow deals with it 
(not VM
> > > > > > >>> itself). It seems for me as a bug in RI. Do you think so?
> > > > > > >>>
> > > > > > >> Hi Evgueni,
> > > > > > >>
> > > > > > >> I see the same thing - if I run your second Test class (the
> > > > > > >> UncaughtExceptionHandler
> > > > > > >> test) with my simple launcher on the RI and J9 I do not see any 
output.
> > > > > > >> i.e. the MyHandler.uncaughtException() method is never called.
> > > > > > >>
> > > > > > >> Having a Google around I found a link to a Sun bug registered 
for this [1].
> > > > > > >> All our launcher needs to do is call DetachCurrentThread() on 
the main
> > > > > > >> thread before DestroyJavaVM(), and the UncaughtExceptionHandler 
will
> > > > > > >> be called as expected. (This bug only occurs with exception 
handlers
> > > > > > >> registered to the main thread - I verified this with [2] which 
has its
> > > > > > >> non-main
> > > > > > >> thread's exception handler called correctly)
> > > > > > >>
> > > > > > >> So if you add the line:
> > > > > > >>   (*jvm)->DetachCurrentThread(jvm);
> > > > > > >> to my simple launcher just before the DestroyJavaVM() call, you 
will see
> > > > > > >> that the MyHandler.uncaughtException() is called for the main 
thread, and
> > > > > > >> the test works as expected.
> > > > > > >>
> > > > > > >> This looks like it needs to be added to our launcher - do you 
agree?
> > > > > > >>
> > > > > > >> What is even more interesting is that if I run your more simple 
Test class
> > > > > > >> (the one that just does 'throw new Error("my");'), with the
> > > > > > >> DetachCurrentThread()
> > > > > > >> call added to the simple launcher I get a stack trace printed on 
both RI
> > > > > > >> and J9!
> > > > > > >> Again it appears that this is only a problem with the main 
thread (if
> > > > > > >> you alter
> > > > > > >> [2] before so that the handler is not registered, you get the 
expected
> > > > > > >> stack trace).
> > > > > > >> So it seems that adding DetachCurrentThread to the launcher 
fixes both
> > > > > > >> problems!
> > > > > > >>
> > > > > > >> Regards,
> > > > > > >> Oliver
> > > > > > >>
> > > > > > >> [1] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4992454
> > > > > > >> [2]
> > > > > > >> public class Test {
> > > > > > >>    static class MyHandler implements 
Thread.UncaughtExceptionHandler {
> > > > > > >>        public void uncaughtException(Thread t, Throwable e) {
> > > > > > >>            System.out.println("My Handler Called!!!");
> > > > > > >>        }
> > > > > > >>   }
> > > > > > >>
> > > > > > >>    static class MyRunnable implements Runnable {
> > > > > > >>        public void run() {
> > > > > > >>            Thread.currentThread().setUncaughtExceptionHandler(new
> > > > > > >> MyHandler());
> > > > > > >>            throw new Error("my");
> > > > > > >>        }
> > > > > > >>    }
> > > > > > >>
> > > > > > >>    public static void main(String [] args) {
> > > > > > >>        Thread t = new Thread(new MyRunnable());
> > > > > > >>        t.start();
> > > > > > >>        try {
> > > > > > >>            t.join();
> > > > > > >>        } catch (InterruptedException e) {
> > > > > > >>            System.out.println("Interrupted!");
> > > > > > >>        }
> > > > > > >>    }
> > > > > > >> }
> > > > > > >>
> > > > > > >>
> > > > > > >>> Evgueni
> > > > > > >>>
> > > > > > >>> On 9/21/06, Oliver Deakin <[EMAIL PROTECTED]> wrote:
> > > > > > >>>
> > > > > > >>>> Hi Evgueni,
> > > > > > >>>>
> > > > > > >>>> I wrote a simple launcher [1] that does the following:
> > > > > > >>>> 1) Calls CreateJavaVM
> > > > > > >>>> 2) Runs the main method of your Test class below
> > > > > > >>>> 3) Calls DestroyJavaVM
> > > > > > >>>>
> > > > > > >>>> Note that it does *not* call env->ExceptionDescribe() before 
destroying
> > > > > > >>>> the VM.
> > > > > > >>>> I tested this launcher against the RI and J9 and found that no 
stack
> > > > > > >>>> trace or
> > > > > > >>>> error details are printed.
> > > > > > >>>> So I would say that it is standard behaviour for the VM not to 
output
> > > > > > >>>> any
> > > > > > >>>> information about uncaught exceptions when shutting down, and 
that the
> > > > > > >>>> launcher
> > > > > > >>>> is expected to call ExceptionDescribe() if it wants any 
details to be
> > > > > > >>>> printed.
> > > > > > >>>>
> > > > > > >>>> So from what you have said below, IMHO we need to:
> > > > > > >>>>  - Change DRLVM to not print stack trace if there is an 
uncaught
> > > > > > >>>> exception at
> > > > > > >>>> shutdown.
> > > > > > >>>>  - If necessary, change the launcher to make sure 
ExceptionDescribe() is
> > > > > > >>>> called
> > > > > > >>>> before DestroyJavaVM().
> > > > > > >>>>
> > > > > > >>>> Does that sound right?
> > > > > > >>>>
> > > > > > >>>> Regards,
> > > > > > >>>> Oliver
> > > > > > >>>>
> > > > > > >>>> [1]
> > > > > > >>>> #include <jni.h>
> > > > > > >>>> main() {
> > > > > > >>>>    JNIEnv *env;
> > > > > > >>>>    JavaVM *jvm;
> > > > > > >>>>    jint result;
> > > > > > >>>>    jclass cls;
> > > > > > >>>>    jmethodID mid;
> > > > > > >>>>
> > > > > > >>>>    JavaVMInitArgs vmargs;
> > > > > > >>>>    vmargs.version = 0x00010002;
> > > > > > >>>>    vmargs.nOptions = 0;
> > > > > > >>>>    vmargs.ignoreUnrecognized = JNI_TRUE;
> > > > > > >>>>
> > > > > > >>>>    result=JNI_CreateJavaVM(&jvm, (void**)&env, &vmargs);
> > > > > > >>>>
> > > > > > >>>>    if (result<0) {
> > > > > > >>>>        fprintf(stderr, "Cannot create JavaVM\n");
> > > > > > >>>>        exit(1);
> > > > > > >>>>    }
> > > > > > >>>>
> > > > > > >>>>    cls = (*env)->FindClass(env, "TestClass");
> > > > > > >>>>
> > > > > > >>>>    if(cls == NULL)
> > > > > > >>>>    {
> > > > > > >>>>        printf("ERROR: FindClass failed.\n");
> > > > > > >>>>        goto destroy;
> > > > > > >>>>    }
> > > > > > >>>>
> > > > > > >>>>    mid = (*env)->GetStaticMethodID(env, cls, "main",
> > > > > > >>>> "([Ljava/lang/String;)V");
> > > > > > >>>>    if(mid==NULL)
> > > > > > >>>>    {
> > > > > > >>>>        printf("ERROR: GetStaticMethodID call failed.\n");
> > > > > > >>>>        goto destroy;
> > > > > > >>>>    }
> > > > > > >>>>
> > > > > > >>>>    (*env)->CallStaticVoidMethod(env, cls, mid, NULL);
> > > > > > >>>>
> > > > > > >>>> destroy:
> > > > > > >>>>    (*jvm)->DestroyJavaVM(jvm);
> > > > > > >>>> }
> > > > > > >>>>
> > > > > > >>>>
> > > > > > >>>>
> > > > > > >>>> Evgueni Brevnov wrote:
> > > > > > >>>>
> > > > > > >>>>> Hi All,
> > > > > > >>>>>
> > > > > > >>>>> I'm almost done with the implementation of Invocation API for 
DRLVM.
> > > > > > >>>>> While testing it I ran into a problem when an exception is 
printed
> > > > > > >>>>> twice. I created a simple application which just throws an 
error and
> > > > > > >>>>> it is not handled by any exception handler:
> > > > > > >>>>>
> > > > > > >>>>> public class Test {
> > > > > > >>>>>    public static void main(String [] args) {
> > > > > > >>>>>        throw new Error("my");
> > > > > > >>>>>    }
> > > > > > >>>>> }
> > > > > > >>>>>
> > > > > > >>>>> In this case the launcher calls env->ExceptionDescribe() 
before
> > > > > > >>>>> destroying VM.  Then it calls DestroyJavaVM() which identifies
> > > > > > >>>>> unhanded exception and calls an uncaught exception handler 
(see
> > > > > > >>>>> java.lang.Thread.getUncaughtExceptionHandler()) for the 
current
> > > > > > >>>>> thread. By default the handler prints the exception one more 
time.
> > > > > > >>>>> That's definitely differs from RI where the exception is 
printed out
> > > > > > >>>>> only once.
> > > > > > >>>>>
> > > > > > >>>>> To identify where the problem is I created another simple 
test and
> > > > > > >>>>> runs it on RI and DRLVM:
> > > > > > >>>>>
> > > > > > >>>>> public class Test {
> > > > > > >>>>>
> > > > > > >>>>>    static class MyHandler implements 
Thread.UncaughtExceptionHandler {
> > > > > > >>>>>        public void uncaughtException(Thread t, Throwable e) {
> > > > > > >>>>>            System.out.println("My Handler Called!!!");
> > > > > > >>>>>        }
> > > > > > >>>>>    }
> > > > > > >>>>>
> > > > > > >>>>>    public static void main(String [] args) {
> > > > > > >>>>>        Thread.currentThread().setUncaughtExceptionHandler(new
> > > > > > >>>>> MyHandler());
> > > > > > >>>>>        throw new Error("my");
> > > > > > >>>>>    }
> > > > > > >>>>> }
> > > > > > >>>>>
> > > > > > >>>>> Here is the output:
> > > > > > >>>>>
> > > > > > >>>>> RI: java.exe Test
> > > > > > >>>>> My Handler Called!!!
> > > > > > >>>>>
> > > > > > >>>>> DRLVM: java.exe Test
> > > > > > >>>>> java/lang/Error : my
> > > > > > >>>>> at Test.main (Test.java: 12)
> > > > > > >>>>> My Handler Called!!!
> > > > > > >>>>>
> > > > > > >>>>> As you can see RI doesn't print exception stack trace at all. 
But
> > > > > > >>>>> DRLVM does. To be precise the launcher does. So we need to 
fix the
> > > > > > >>>>> launcher.....
> > > > > > >>>>>
> > > > > > >>>>> Note: The behaviour of DRLVM you have may differ from listed 
above
> > > > > > >>>>> since all experiments were done on my local workspace with 
Invocation
> > > > > > >>>>> API implemented.
> > > > > > >>>>>
> > > > > > >>>>> 
---------------------------------------------------------------------
> > > > > > >>>>> Terms of use : 
http://incubator.apache.org/harmony/mailing.html
> > > > > > >>>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > > >>>>> For additional commands, e-mail: [EMAIL PROTECTED]
> > > > > > >>>>>
> > > > > > >>>>>
> > > > > > >>>>>
> > > > > > >>>> --
> > > > > > >>>> Oliver Deakin
> > > > > > >>>> IBM United Kingdom Limited
> > > > > > >>>>
> > > > > > >>>>
> > > > > > >>>> 
---------------------------------------------------------------------
> > > > > > >>>> Terms of use : http://incubator.apache.org/harmony/mailing.html
> > > > > > >>>> To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > > >>>> For additional commands, e-mail: [EMAIL PROTECTED]
> > > > > > >>>>
> > > > > > >>>>
> > > > > > >>>>
> > > > > > >>> 
---------------------------------------------------------------------
> > > > > > >>> Terms of use : http://incubator.apache.org/harmony/mailing.html
> > > > > > >>> To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > > >>> For additional commands, e-mail: [EMAIL PROTECTED]
> > > > > > >>>
> > > > > > >>>
> > > > > > >>>
> > > > > > >
> > > > > > >
> > > > > >
> > > > > > --
> > > > > > Oliver Deakin
> > > > > > IBM United Kingdom Limited
> > > > > >
> > > > > >
> > > > > > 
---------------------------------------------------------------------
> > > > > > Terms of use : http://incubator.apache.org/harmony/mailing.html
> > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > > > >
> > > > > >
> > > > >
> > > >
> > > > ---------------------------------------------------------------------
> > > > Terms of use : http://incubator.apache.org/harmony/mailing.html
> > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > >
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > Terms of use : http://incubator.apache.org/harmony/mailing.html
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
> > ---------------------------------------------------------------------
> > Terms of use : http://incubator.apache.org/harmony/mailing.html
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
> ---------------------------------------------------------------------
> Terms of use : http://incubator.apache.org/harmony/mailing.html
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

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



---------------------------------------------------------------------
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