MOO-cows Mailing List Archive


Re: Memory Leak?

>I was browsing through the LambdaMOO 1.7.8p4 source, and I seem to have 
>come across a memory leak.

Been doing that myself recently.

>Would somebody be kind enough to double check and let me know if it is 
>indeed a memory leak or not?
>in tasks.c, the function do_command_task(), the last 'else' section, and 
>I quote the pertinant code:
>        else {
>            Var result, args;
>            args = parse_into_wordlist(command);
>            free_var(result);
>	}
>*should* have the last section read:
>            free_var(result);
>	    free_var(args);
>	}
>I checked to see if the lack of free_var(args) would in fact cause a
>memory leak, and it does seem to.  Past life regression therapy reveals:

I believe that the args are 'comsumed' (free'd) some place else in the call
chain (like in run_server_task or something).  Plus, if this was a memory
leak, it's such a big one, that someone would have noticed it a long time
ago (do_command_task() is called more often than not :) ).

>'Var args' is released by the call to do_command_task() (or, at least,
>that's what I can make out).  My appologies for the incorrect first post,
>I got confused with my earlier fiddling.  If you have the free_var(args)
>call with the free_var(result), you will panic your server, a unhappy 
>state of affairs indeed :)

Herf... I find panics to be better than the server just continuing on
blindly into bad code.  Got over 40 panics myself last night. :) 
Actually, I'm find this very confusing myself.  Could Pavel have installed
this (goofy?) system of free'ing just to confuse us and keep us from modding
the server? herf... anyway...

A related question:
I can't seem to get the entire argument list to a builtin function in
functions.c:call_bi_func.  Here's the code that's causing confusion:

>/*** calling built-in functions ***/
>call_bi_func(unsigned n, Var arglist, Byte func_pc,
>             Objid progr, void *vdata)
>     /* requires arglist.type == TYPE_LIST
>        call_bi_func will free arglist */

Okay, I think I understand that... arglist needs to be a list.

But for some reason, I only end up with the first element when I use code
like (which appears not 10 lines later):

>    if (func_pc == 1) { /* check arg types and count *ONLY* for first entry */
>        int k, max;
>        Var *args = arglist.v.list;

Obviously, arglist.v.list contains the entire argument list, otherwise it
wouldn't be able to check all the types and count (I think).
I have a variable defined as:

Var *xargs = arglist.v.list;

But in a call to call_verb later on, in which I do use xargs, but the value
of args in the verb it's calling is not a list.  It's the value of the first
element of said list.  I think I'm figgling with arglist in the wrong way,
perhaps call_verb (or it's resulting functions) is expecting something
different.  If I set xargs = arglist, then I get an error later on also
(server panic, but I will have to check). Any ideas?  This comment and use
of arglist.v.list is really beating the hell outta me.

  ______                              __
    /   /                 _/_      / /  `  /)  /)       _/_
 --/   /_  , , , __.  __  /  _  __/ /--   //  //  __,_  /  _
(_/   / /_(_(_/_(_/|_/ (_<__</_(_/ (___, //__//__(_) (_<__/_)_ />  />
                                       </  </

Home | Subject Index | Thread Index