浏览代码

- Some cleanup of run_script, should fix the memory leak there.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@6718 54d463be-8e91-2dee-dedb-b68131a5f0ec
skotlex 19 年之前
父节点
当前提交
8b29b1574f
共有 2 个文件被更改,包括 31 次插入26 次删除
  1. 1 0
      Changelog-Trunk.txt
  2. 30 26
      src/map/script.c

+ 1 - 0
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

+ 30 - 26
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) {
-			// ƒXƒ^ƒbƒN�î•ñ‚ð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;
 }
 
 /*==========================================