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