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