This is a major fix for the web crowd. Can we get a new fcgi release pretty please? Thanks a lot for this Kirk On Wed, 23 Mar 2005 02:09:55 +0900, Kirk Haines <wyhaines / gmail.com> wrote: > Nutshell: The 0.8.5 version of the C extension for FCGI for Ruby leaks, > badly. I have a patch file at http://enigo.com/downloads/fcgi.c.patch if > you want to skip the explanation below and go right to it. > > ----- > > http://enigo.com/projects/iowa/fcgipatch.html > > When using the 0.8.5 version of the Ruby FCGI module with the C extension > instead of the pure Ruby extension, I noticed a substantial memory leak, to > the tune of around 16k+/request. A little poking through the code turned up > two seperate regions where memory is allocated without any provision to > free it later. > > The first such instance occurs in the > > fcgi_s_accept() > > function. Memory is allocated to hold the FCGI request structure > (FCGX_Request), with this line: > > req = ALLOC(FCGX_Request); > > Then a data struct (fcgi_data), which has slots to hold the FCGI request, > the data streams, and the environment variables, is turned into a Ruby > object with a call to > > Data_Make_Struct > > A mark function is provided that marks the stream and environment slots for > the garbage collector. The request slot, however, is not marked since it > points to a C struct and not to a Ruby object. However, a free function is > not provided to cleanup either the root object or the request structure > that it contains. This is the first memory leak. It is fixed by providing a > function that will free this memory. This bug, with the same fix, was also > mentioned on ruby-core > (http://www.ruby-talk.org/cgi-bin/scat.rb/ruby/ruby-core/3245)last year in > reference to version 0.8.4. > > Add this: > > static void fcgi_free_req(fcgi_data *data) > { > free(data-<req); > free(data); > } > > And then replace this: > > obj = Data_Make_Struct(self, fcgi_data, fcgi_mark, 0, data); > > with this: > > obj = Data_Make_Struct(self, fcgi_data, fcgi_mark, fcgi_free_req, data); > > The second memory leak is found in the > > fcgi_stream_read() > > function. It allocates a buffer to use when reading data from the stream, > but that buffer is not freed at any of the points where the function can be > exited. The fix is just to add > > free(buff); > > before each of the possible exit points. > > With these two sets of changes in place, I have now ran more than two > million requests through FCGI, with a completely flat memory utilization. A > patch file with these changes can be found at > > http://enigo.com/downloads/fcgi.c.patch > > Thanks, > > Kirk Haines > > -- Tobi http://www.snowdevil.ca - Snowboards that don't suck http://www.hieraki.org - Open source book authoring http://blog.leetsoft.com - Technical weblog