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?

Bill

Reply via email to