summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt1
-rw-r--r--src/map/script.c56
2 files changed, 31 insertions, 26 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index a96473179..4422ad15a 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,7 @@ 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/05/23
+ * Some cleanup of run_script, should fix the memory leak there. [Skotlex]
* the charname request hack message has been downgraded to only include
GM-invisible characters. [Skotlex]
* corrected clif_charnameack to send negative ID when a disguised player
diff --git a/src/map/script.c b/src/map/script.c
index b5273721b..cde146b1a 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -11350,8 +11350,10 @@ int run_script_main(struct script_state *st)
break;
}
- if(st->state == END)
+ if(st->state == END) {
script_free_stack (st->stack);
+ st->stack = NULL;
+ }
return 0;
}
@@ -11374,7 +11376,7 @@ int run_script(struct script_code *rootscript,int pos,int rid,int oid)
if (rootscript == NULL || pos < 0)
return -1;
- st = calloc(sizeof(struct script_state), 1);
+ st = aCalloc(sizeof(struct script_state), 1);
if ((sd = map_id2sd(rid)) && sd->stack && sd->npc_scriptroot == rootscript){
// we have a stack for the same script, should continue exec.
@@ -11412,12 +11414,12 @@ int run_script(struct script_code *rootscript,int pos,int rid,int oid)
// let's run that stuff
run_script_main(st);
- if(st){
- if(st->sleep.tick > 0) {
- // スタック情報をsleep_dbに保存
- unsigned int tick = gettick()+st->sleep.tick;
- st->sleep.charid = sd ? sd->char_id : 0;
- st->sleep.timer = add_timer(tick, run_script_timer, st->sleep.charid, (int)st);
+ if(st->state != END){
+ if(st->sleep.tick > 0)
+ { //Delay execution
+ st->sleep.charid = sd?sd->char_id:0;
+ st->sleep.timer = add_timer(gettick()+st->sleep.tick,
+ run_script_timer, st->sleep.charid, (int)st);
linkdb_insert(&sleep_db, (void*)st->oid, st);
} else if (sd) {
// script is not finished, store data in sd.
@@ -11428,25 +11430,27 @@ int run_script(struct script_code *rootscript,int pos,int rid,int oid)
if (bck_stack) //Get rid of the backup as it can't be restored.
script_free_stack (bck_stack);
}
- } else {
- // and if there was a sd associated - zero vars.
- if (sd) {
- //Clear or restore previous script.
- sd->npc_script = bck_script;
- sd->npc_scriptroot = bck_scriptroot;
- sd->npc_scriptstate = bck_scriptstate;
- sd->stack = bck_stack;
- //Since the script is done, save any changed account variables [Skotlex]
- if (sd->state.reg_dirty&2)
- intif_saveregistry(sd,2);
- if (sd->state.reg_dirty&1)
- intif_saveregistry(sd,1);
- }
- //aFree(st);
- return 0;
+ return st->pos;
}
-
- return st->pos;
+ //Script finished.
+ if (sd)
+ { //Clear or restore previous script.
+ sd->npc_script = bck_script;
+ sd->npc_scriptroot = bck_scriptroot;
+ sd->npc_scriptstate = bck_scriptstate;
+ sd->stack = bck_stack;
+ //Since the script is done, save any changed account variables [Skotlex]
+ if (sd->state.reg_dirty&2)
+ intif_saveregistry(sd,2);
+ if (sd->state.reg_dirty&1)
+ intif_saveregistry(sd,1);
+ }
+ if(st->stack) {
+ script_free_stack (st->stack);
+ st->stack = NULL;
+ }
+ aFree(st);
+ return 0;
}
/*==========================================