Re: [sdljava-users] Possible memory leak in SWIG_SDLVideo / SDL_Surface / SWIG_SDLImage
Status: Beta
Brought to you by:
ivan_ganza
From: Ivan Z. G. <iva...@ya...> - 2006-09-24 17:26:36
|
Greetings, I've implemented the fixes as suggested and the code is checked into CVS. Before I checked in the changes I tagged the source as "PRE_MEMORY_LEAK_FIX" and afterwards I tagged as "POST_MEMORY_LEAK_FIXES". Please let me know if there are any problems. Cheers, -Ivan/ Patric Rufflar wrote: >Hi Ivan, > >You're welcome. >I'm glad that I could help improving sdljava. :) > >By the way: SWIG_SDLTTF and SWIG_SDLGfx contain faulty constructors of >SDL_Surfaces, too. Please set false to true to fix this. > >Now I cannot see any other memory leaks (for now ;-) ) > >And for now, I can't await that other points of my wishlist will come true :) >- new sdljava release :) >- new sdljava release for windows (oh, please. But maybe I have some free time >in the future and have a look how to set up a suitable build environment) >- Support ffmpeg >- full YUV Support (or do we have a complete and tested support already?) >- Investigation of some rare core dumps. For example, SDLVideo.videoDriverName() >always crashes on my machine (windows, directx). >- Support SDL_sound library > >Patric > > > >Ivan Z. Ganza schrieb: > > >>Hi Patric, >> >>I didn't even have a chance to look at it properly and you've already >>solved it! >> >>Thanks so much for the detailed look you had at this. Will go over it, >>it looks good. The only problem is we have to change the way SWIG >>auto-generates the code. For now I'll just patch the file as you've >>shown. Eventually I'll need to figure out how to get SWIG to generate >>the wrapper code with that change in place. We don't really generate >>the wrapper code often so it should be alright. The only time would be >>when making the wrappers for a new OS or if it was required for some >>other reason like a new SDL version, etc.... >> >>Will let you know when its in. >> >>Cheers, >>-Ivan/ >> >>Patric Rufflar wrote: >> >> >> >>>Hi Ivan, hi all, >>> >>>After playing around with the patched source I realized that >>>there is another critical memory problem. >>> >>>At first, please have a look at the jni definition inside SWIG_SDLVideoJNI >>> >>>public final static native void SDL_FreeSurface(long jarg1); >>>public final static native void delete_SDL_Surface(long jarg1); >>>public final static native long new_SDL_Surface(); >>> >>> >>>The first method, SDL_FreeSurface(), is ok. It does what it name >>>suggests, it calls the corresponding native SDL method. >>> >>>The other two methods seems to me dummy native methods for >>>contructors/destructors. The original SDL_surface.c does not contain >>>any constructors/destructors, because it's pure c. >>>So I think these jni calls do nothing. >>> >>> >>>Ok, let's now have a look at SDLSurface.freeSurface() which will be >>>called on its finalization. >>> >>> public void freeSurface() throws SDLException { >>> SWIG_SDLVideo.SDL_FreeSurface(swigSurface); >>> swigSurface = null; >>> pixelData = null; >>> } >>> >>>As we can see, the real surface of the embedded SDL_Surface proxy object >>>will be freed. But what happens if there are other valid references to >>>this proxy object? It's memory pointer to the sdl surface is not valid >>>anymore, freeing this object may end up in a core dump. >>> >>>Now let's have a look at SDL_Surface finalization method, delete(): >>> >>> public void delete() { >>> if(swigCPtr != 0 && swigCMemOwn) { >>> swigCMemOwn = false; >>> SWIG_SDLVideoJNI.delete_SDL_Surface(swigCPtr); >>> } >>> swigCPtr = 0; >>> } >>> >>>This method calls the jni delete method, which is only a dummy. The real >>>memory is not freed. This is the memory leak. >>> >>>Because some SDL_Surface objects seem to be created without referenced >>>by a SDLSurface. But I have to admit that I cannot give an example in >>>the source right now. >>> >>>To fix these two problems, I suggest the following solution: >>> >>>Changes at SDLSurface: >>> public void freeSurface() throws SDLException { >>> SWIG_SDLVideo.SDL_FreeSurface(swigSurface); <<--delete this line >>> swigSurface = null; >>> pixelData = null; >>> } >>> >>> >>>Changes at SDL_Surface: >>> public void delete() { >>> if(swigCPtr != 0 && swigCMemOwn) { >>> SWIG_SDLVideo.SDL_FreeSurface(this); // As you can see, >>>//delete_SDL_Surface() has been replaced by the correct method. >>> swigCMemOwn = false; >>> } >>> swigCPtr = 0; >>> } >>> >>> >>>This patch will ensure, that the finalization of the proxy object >>>(SDLSurface) will lead to freeing the surface not it's sdljava interface >>>to it (SDL_Surface). This fixed the memory problems in my application ;) >>> >>>To find those problems I am creating / deleting many surfaces in my >>>application. And It seems that there is at least another (less lossy) >>>memory leak which eats up memory. >>> >>>And I also want to add that the methods of SWIG_SDLImage seems to be >>>affected by the memory leak which I previously described, too. >>> >>> >>>Best Regards >>>Patric Rufflar >>> >>> >>> >>>Ivan Z. Ganza schrieb: >>> >>> >>> >>> >>>>Greetings, >>>> >>>>Thanks for finding this. Yes this is a serious problem. >>>> >>>>I need to do figure out how to get SWIG to set that flag to true instead >>>>of false, then the leak should be eleminated. The code there is >>>>auto-generated by SWIG from the .i files. In the worst case I can >>>>manually run a script after to post-process that stuff and fix it that >>>>way. Either way it will be fixed. >>>> >>>>Cheers, >>>>-Ivan/ >>>> >>>>Jesper Juul / Soup Games wrote: >>>> >>>> >>>> >>>> >>>> >>>>>I wanted to post about this for a long time - I agre there is a leak >>>>>. So far I've worked around it by wrapping all Surfaces in a custom >>>>>object that calls dispose() in the finalizer. >>>>> >>>>> >>>>>-Jesper >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>>>I was wondering a long time why my application needs more and more RAM. >>>>>>I took a while to track down a possible memory leak. >>>>>>It seems to be located in sdljava.x.swig.SWIG_SDLVideo . >>>>>> >>>>>>The following methods seems to be affected: >>>>>>SDL_ConvertSurface(), SDL_DisplayFormat() and SDL_DisplayFormatAlpha() >>>>>> >>>>>>I am not sure at the moment, but maybe other methods have the same problem: >>>>>>SDL_SetVideoMode(), SDL_CreateRGBSurface(), SWIG_SDL_LoadBMP(), >>>>>>SWIG_SDL_CreateRGBSurfaceFrom() >>>>>> >>>>>>Please have a look at the last line of all methods: >>>>>>return (cPtr == 0) ? null : new SDL_Surface(cPtr, false); >>>>>> >>>>>>As you can easily see, false indicates that the new surface cannot free >>>>>>the memory because some other surface seems to also use it. But this is >>>>>>not true, the surface has just been created, no other surface does own >>>>>>this memory area. >>>>>> >>>>>>So this bug should be fixed when setting the second argument of the >>>>>>surface constructors to true. >>>>>> >>>>>>Ivan, would you please verify the problem? >>>>>>Thank you. >>>>>> >>>>>>Best Regards, >>>>>>Patric >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>------------------------------------------------------------------------- >>>>>Using Tomcat but need to do more? Need to support web services, security? >>>>>Get stuff done quickly with pre-integrated technology to make your job easier >>>>>Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo >>>>>http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 >>>>>_______________________________________________ >>>>>sdljava-users mailing list >>>>>sdl...@li... >>>>>https://lists.sourceforge.net/lists/listinfo/sdljava-users >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>------------------------------------------------------------------------- >>>>Using Tomcat but need to do more? Need to support web services, security? >>>>Get stuff done quickly with pre-integrated technology to make your job easier >>>>Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo >>>>http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 >>>>_______________________________________________ >>>>sdljava-users mailing list >>>>sdl...@li... >>>>https://lists.sourceforge.net/lists/listinfo/sdljava-users >>>> >>>> >>>> >>>> >>>> >>>> >>>------------------------------------------------------------------------- >>>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 >>>_______________________________________________ >>>sdljava-users mailing list >>>sdl...@li... >>>https://lists.sourceforge.net/lists/listinfo/sdljava-users >>> >>> >>> >>> >>------------------------------------------------------------------------- >>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 >>_______________________________________________ >>sdljava-users mailing list >>sdl...@li... >>https://lists.sourceforge.net/lists/listinfo/sdljava-users >> >> >> >> > >------------------------------------------------------------------------- >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 >_______________________________________________ >sdljava-users mailing list >sdl...@li... >https://lists.sourceforge.net/lists/listinfo/sdljava-users > > |