summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-08-02 15:40:25 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-08-02 15:40:25 +0000
commit2898a10e8ec1df9afaa27ff1d0cb685fcb964720 (patch)
tree8cd3de8a740256d8d5afefa55206138ae4139bae
parenteb941f3cf5b97d09faa34116e78648b7eaf6b2fb (diff)
downloadhercules-2898a10e8ec1df9afaa27ff1d0cb685fcb964720.tar.gz
hercules-2898a10e8ec1df9afaa27ff1d0cb685fcb964720.tar.bz2
hercules-2898a10e8ec1df9afaa27ff1d0cb685fcb964720.tar.xz
hercules-2898a10e8ec1df9afaa27ff1d0cb685fcb964720.zip
- 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
-rw-r--r--Changelog-Trunk.txt5
-rw-r--r--src/map/map.c7
-rw-r--r--src/map/script.c16
-rw-r--r--src/map/script.h4
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);