On Wed, 6 May 1998, Gary Barnett wrote: >The buffer system is all well and fine, I didn't have any difficulty >determining how it works or how to get it functional. Good, I might end up actually working on it again shortly. (Now that I found a little manual on POSIX thread locking for real.) :) >However, it has become time to add all the release_buffer calls and with >2798 get_buffer calls I find myself dreading the prospect. I know what you mean, I had a lot of them in for the 1.5 release (I think) but gave up trying to finish it for the 1.6 release. I ended up only changing the output buffer calls. >I cannot do them a little at a time, as I can't place into production a >mud that uses 180megs of ram at startup before the buffers time out and it >settles down to 10 megs (which is a nice reduction from before I started >adding the buffer system.) You can add calls to release_all_buffers() in strategic points of the bootloading. It's a hack but that's what I did whilst trying to hunt down all the release_buffer() calls I missed in v1.5. >1) Write a program to read the source and put all the release_buffer calls >in for me. > a) search for all get_buffer calls in the file > b) with each get_buffer call, read the source until you get another void, >int or struct, acmd call (not prototype). > 1) if you find a return, either warn or add the release buffers there Personally, I'd have it warn about every function with a get_buffer() without a release_buffer(). I wouldn't get into the added complexity of having the program figure out if the buffer _might_ not be freed. That's why the 'forgot to free' message is there. >2) Use a call to 'register' the buffers > a) update register buffer to allow buffer requests w/o intervening code >to count as one entry in structure > b) #define RETURN {release_my_buffers;return;} > c) remove all buffers from the 'last' entry in a) Version 1.3 used to have: #define release_and_return release_my_buffers(); return Nowadays, I'd say to use: #define release_and_return(x) do{release_my_buffers();return(x);}while(0); You have to use "return (x);" instead of "return x;" but that's it. Note that you have to have GCC for 'release_my_buffers()' to work properly. >3) Store the function being processed in a local var for each function. Use >that to figure out what buffers are in use by the function. This would >require storing instance data in a static var for recursive routines. Add "show_buffers(NULL);" to parts of code where you want to see who is using what. >#2 would probably become a mess and redefining return seems wrong. Version 1.3 of the patch did that a lot... >#3 would waste a lot of memory storing function names and the static int for >recursion would be easy to mess up. show_buffers() and release_my_buffers() should help until you do something more proper. (Of course, if your MUD is C++, or C++ capable, I have a mostly working C++ Buffer class you can basically drop in in place of 'char *'s.) -- George Greer, greerga@circlemud.org | Genius may have its limitations, but http://patches.van.ml.org/ | stupidity is not thus handicapped. http://www.van.ml.org/CircleMUD/ | -- Elbert Hubbard +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST