On Mar 10, 2009, at 10:02, Bill Janssen <jans...@parc.com> wrote:

Andi Vajda <va...@apache.org> wrote:

On Mon, 9 Mar 2009, Bill Janssen wrote:

I just spent some time tracking down a core dump in a big Python
program, in PyLucene, till I figured out that the thread making the call
had never been registered as a Java thread (the code at some interim
calling frame changed till it suddenly was calling into Java).

Is there some way to make that throw an exception rather than a segfault -- "Attempt to call into Java from a non-Java thread"? That would be
really useful.

Yes, there is a way but I'm not sure it's too efficient. If the
JCCEnv::get_vm_env() method returns NULL it can mean that your thread
wasn't attached to the VM. More precisely, if you didn't attach your
thread, this method must be returning NULL.

   inline JNIEnv *get_vm_env()
   {
       return (JNIEnv *) pthread_getspecific(VM_ENV);
   }

The problem is that this method is called a _lot_ and adding code
checking the value and raising an exception would be costly for this
currently short inlined function.

It would be ideal if a less frequently called, but nonetheless
indispensable, piece of code could catch that problem instead of
adding a check at that low a level. I haven't found one yet. Another
way to improve this (and the similar problem of missing the call to
initVM()) would be to have a better debug mode where the check would
be then compiled in.

So, it sounds like I could add to my code a call to lucene.getVMEnv().
If it returns None, it's a bad thread, and I shouldn't make any other
calls to lucene in it. That way I could control the efficiency concerns
in application code.  Right?

I'm not sure (not near my computer at the moment) but if you are prepared to call a piece of code, why not call attachCurrentThread() then ? it's supposed to be a nop if it was called before.

Andi..



Bill

Reply via email to