Re: [sdljava-users] Possible memory leak in SWIG_SDLVideo / SDL_Surface / SWIG_SDLImage
Status: Beta
Brought to you by:
ivan_ganza
From: Patric R. <pa...@ma...> - 2006-09-22 00:15:59
|
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 > > |