From 2898a10e8ec1df9afaa27ff1d0cb685fcb964720 Mon Sep 17 00:00:00 2001 From: skotlex Date: Wed, 2 Aug 2006 15:40:25 +0000 Subject: - Fixed script code data not being free'd if a player quits in the middle of a script. - Modified run_script so that when there are leaks, it will report the place where run_script was called from as source rather than the inner code of run_script (for debugging purposes) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@8057 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 5 +++++ src/map/map.c | 7 +++++++ src/map/script.c | 16 +++++++++++----- src/map/script.h | 4 +++- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index a934c255c..5b673aadb 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,11 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2006/08/02 + * Fixed script code data not being free'd if a player quits in the middle + of a script. [Skotlex] + * Modified run_script so that when there are leaks, it will report the + place where run_script was called from as source rather than the inner code + of run_script (for debugging purposes) [Skotlex] * Made recursive master check the default (otherwise it messes skill -> pet -> player kind of herarchies) and cleaned up some the battle_get_master code to prevent infinite loops in the weird case someone specifies that diff --git a/src/map/map.c b/src/map/map.c index 2e198bb0d..34a18f033 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1695,6 +1695,13 @@ int map_quit(struct map_session_data *sd) { sd->regstr = NULL; sd->regstr_num = 0; } + if (sd->st) { + if (sd->st->stack) + script_free_stack (sd->st->stack); + aFree(sd->st); + sd->st = NULL; + sd->npc_id = 0; + } if(sd->fd) { //Player will be free'd on save-ack. [Skotlex] if (session[sd->fd]) diff --git a/src/map/script.c b/src/map/script.c index b26cbf749..23bc4c505 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2500,7 +2500,9 @@ int run_func(struct script_state *st) */ void run_script_main(struct script_state *st); -void run_script(struct script_code *rootscript,int pos,int rid,int oid) +//FIXME: Temporary replacement to locate the leak source. +//void run_script(struct script_code *rootscript,int pos,int rid,int oid) +void run_script_sub(struct script_code *rootscript,int pos,int rid,int oid, char* file, int lineno) { struct script_state *st; struct map_session_data *sd=NULL; @@ -2513,14 +2515,18 @@ void run_script(struct script_code *rootscript,int pos,int rid,int oid) //Resume script. st = sd->st; } else { - st = aCalloc(sizeof(struct script_state), 1); +// st = aCalloc(sizeof(struct script_state), 1); + st = _mcalloc(sizeof(struct script_state), 1, file, lineno, __func__); // the script is different, make new script_state and stack - st->stack = aMalloc (sizeof(struct script_stack)); +// st->stack = aMalloc (sizeof(struct script_stack)); + st->stack = _mmalloc(sizeof(struct script_stack), file, lineno, __func__); st->stack->sp=0; st->stack->sp_max=64; - st->stack->stack_data = (struct script_data *)aCalloc(st->stack->sp_max,sizeof(st->stack->stack_data[0])); +// st->stack->stack_data = (struct script_data *)aCalloc(st->stack->sp_max,sizeof(st->stack->stack_data[0])); + st->stack->stack_data = (struct script_data *)_mcalloc(st->stack->sp_max,sizeof(st->stack->stack_data[0]), file, lineno, __func__); st->stack->defsp = st->stack->sp; - st->stack->var_function = aCalloc(1, sizeof(struct linkdb_node*)); +// st->stack->var_function = aCalloc(1, sizeof(struct linkdb_node*)); + st->stack->var_function = _mcalloc(1, sizeof(struct linkdb_node*), file, lineno, __func__); st->state = RUN; st->script = rootscript; } diff --git a/src/map/script.h b/src/map/script.h index 8ce446212..f4bca3569 100644 --- a/src/map/script.h +++ b/src/map/script.h @@ -62,7 +62,9 @@ struct script_state { }; struct script_code* parse_script(unsigned char *,const char*,int); -void run_script(struct script_code*,int,int,int); +void run_script_sub(struct script_code *rootscript,int pos,int rid,int oid, char* file, int lineno); +//void run_script(struct script_code*,int,int,int); +#define run_script(sc,pos,rid,oid) run_script_sub(sc,pos,rid,oid,__FILE__,__LINE__) int set_var(struct map_session_data *sd, char *name, void *val); int conv_num(struct script_state *st,struct script_data *data); -- cgit v1.2.3-70-g09d2