Re: Director is not deleted properly
Thomas Dudziak <tomdzk <at> gmail.com>
2006-08-03 04:16:44 GMT
On 8/1/06, William S Fulton <wsf <at> fultondesigns.co.uk> wrote:
> I havn't much time to look at this, but it would be worth looking at
> SWIG_DIRECTOR_OWNED in java.swg and the swigTakeOwnership() and
> swigReleaseOwnership() methods in the director proxy class and let us
> know how you get on as I don't think any of this was documented.
>From what I can see, it has nothing to do with ownership (the C++
listener object is owned by Java as it should be), but rather with the
fact, that callin methods of the C++ listener in a different C++
thread results in two different jenv's being used. So it might be that
one of the two jenvs is not properly released or something ?
You can have a look yourself on what is going on via the log below.
Basically, I added log statements at the beginning and end of every
method in the swig generated C++/C code. The log below is the output
generated by running the Java test program that I attached to the last
mail.
Tom
-----------------
[Java_swigtest_swigtestJNI_swig_1module_1init] Entering:
jenv=003E627C, jcls=0013F464
[Java_swigtest_swigtestJNI_swig_1module_1init] Exiting
[Java_swigtest_swigtestJNI_new_1Listener] Entering: jenv=003E627C, jcls=0013F800
[JObjectWrapper::JObjectWrapper] Creating new wrapper object: 0092888C
[Director::Director] Entering: this=00928884, jenv=003E627C
[Director::Director] Exiting: this=00928884
[SwigDirector_Listener::SwigDirector_Listener] Creating director
object: 00928880
[Java_swigtest_swigtestJNI_new_1Listener] Exiting: jresult=9603200
[Java_swigtest_swigtestJNI_Listener_1director_1connect] Entering:
jenv=003E627C, jcls=0013F7F0, jself=0013F808, objarg=9603200,
jswig_mem_own=, jweak_global=
[SwigDirector_Listener::swig_connect_director] Entering:
this=00928880, jenv=003E627C, jself=0013F808, jcls=00B28D78,
swig_mem_own=1, weak_global=1
[Director::swig_set_self] Entering: this=00928884, jenv=003E627C,
jself=0013F808, mem_own=1, weak_global=1
[JObjectWrapper::set] Entering: this=0092888C, jenv=003E627C,
jobj=0013F808, mem_own=1, weak_global=1
JObjectWrapper::set(0013F808, weak_global) -> 00B0EC68
[JObjectWrapper::JObjectWrapper] Exiting this=0092888C, return=true
[Director::swig_set_self] Exiting: this=00928884, return=1
[SwigDirector_Listener::swig_connect_director] Exiting: this=00928880
[Java_swigtest_swigtestJNI_Listener_1director_1connect] Exiting
[Java_swigtest_swigtestJNI_new_1Test] Entering: jenv=003E627C, jcls=0013F828
[Java_swigtest_swigtestJNI_new_1Test] Exiting: jresult=9603288
[Java_swigtest_swigtestJNI_Test_1addListener] Entering: jenv=003E627C,
jcls=0013F828, jarg1=9603288, jarg2=9603200
[Java_swigtest_swigtestJNI_Test_1addListener] Exiting
[Java_swigtest_swigtestJNI_Test_1start] Entering: jenv=003E627C,
jcls=0013F838, jarg1=9603288
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B36458
[Director::swig_get_self] Exiting: this=00928884, return=00B36458
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B36460
[Director::swig_get_self] Exiting: this=00928884, return=00B36460
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B36468
[Director::swig_get_self] Exiting: this=00928884, return=00B36468
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B36470
[Director::swig_get_self] Exiting: this=00928884, return=00B36470
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B36478
[Director::swig_get_self] Exiting: this=00928884, return=00B36478
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B36480
[Director::swig_get_self] Exiting: this=00928884, return=00B36480
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B36488
[Director::swig_get_self] Exiting: this=00928884, return=00B36488
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B36490
[Director::swig_get_self] Exiting: this=00928884, return=00B36490
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B36498
[Director::swig_get_self] Exiting: this=00928884, return=00B36498
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=00B36174
[Director::swig_get_self] Entering: this=00928884, jenv=00B36174
[JObjectWrapper::get] Entering: this=0092888C, jenv=00B36174
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B364A0
[Director::swig_get_self] Exiting: this=00928884, return=00B364A0
[SwigDirector_Listener::callback] Exiting: this=00928880
[SwigDirector_Listener::callback] Entering: this=00928880
[Director::swig_acquire_jenv] Entering: this=00928884
[Director::swig_acquire_jenv] Exiting: this=00928884, env=003E627C
[Director::swig_get_self] Entering: this=00928884, jenv=003E627C
[JObjectWrapper::get] Entering: this=0092888C, jenv=003E627C
JObjectWrapper::get(00B0EC68) -> return new local ref
[JObjectWrapper::get] Exiting: this=0092888C, return=00B28D78
[Director::swig_get_self] Exiting: this=00928884, return=00B28D78
[SwigDirector_Listener::callback] Exiting: this=00928880
[Java_swigtest_swigtestJNI_Test_1start] Exiting
[Java_swigtest_swigtestJNI_Test_1removeListener] Entering:
jenv=003E627C, jcls=0013F828, jarg1=9603288, jarg2=9603200
[Java_swigtest_swigtestJNI_Test_1removeListener] Exiting
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV