Jelajahi Sumber

Fixed several occurences of map_freeblock() being used before map_deliddb() (caused by r13503, r13505 and r13508) (bugreport:2959).
This would cause object ids (chatrooms / ground items) to never be removed when DEBUG_MEMMGR was turned on, ultimately causing a 'no free object id' fatal error.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13689 54d463be-8e91-2dee-dedb-b68131a5f0ec

ultramage 16 tahun lalu
induk
melakukan
cd82016586
3 mengubah file dengan 4 tambahan dan 4 penghapusan
  1. 2 2
      src/map/chat.c
  2. 1 1
      src/map/map.c
  3. 1 1
      src/map/skill.c

+ 2 - 2
src/map/chat.c

@@ -174,9 +174,9 @@ int chat_leavechat(struct map_session_data* sd, bool kicked)
 	if( cd->users == 0 && cd->owner->type == BL_PC )
 	{	// Delete empty chatroom
 		clif_clearchat(cd, 0);
+		map_deliddb(&cd->bl);
 		map_delblock(&cd->bl);
 		map_freeblock(&cd->bl);
-		map_deliddb(&cd->bl);
 		return 1;
 	}
 
@@ -327,9 +327,9 @@ int chat_deletenpcchat(struct npc_data* nd)
 	
 	chat_npckickall(cd);
 	clif_clearchat(cd, 0);
+	map_deliddb(&cd->bl);
 	map_delblock(&cd->bl);
 	map_freeblock(&cd->bl);
-	map_deliddb(&cd->bl);
 	nd->chat_id = 0;
 	
 	return 0;

+ 1 - 1
src/map/map.c

@@ -1186,9 +1186,9 @@ int map_clearflooritem_timer(int tid, unsigned int tick, int id, intptr data)
 		intif_delete_petdata( MakeDWord(fitem->item_data.card[1],fitem->item_data.card[2]) );
 
 	clif_clearflooritem(fitem,0);
+	map_deliddb(&fitem->bl);
 	map_delblock(&fitem->bl);
 	map_freeblock(&fitem->bl);
-	map_deliddb(&fitem->bl);
 
 	return 0;
 }

+ 1 - 1
src/map/skill.c

@@ -9898,8 +9898,8 @@ int skill_delunitgroup (struct block_list *src, struct skill_unit_group *group)
 		group->valstr = NULL;
 	}
 
-	map_freeblock(&group->unit->bl); // schedules deallocation of whole array (HACK)
 	idb_remove(group_db, group->group_id);
+	map_freeblock(&group->unit->bl); // schedules deallocation of whole array (HACK)
 	group->unit=NULL;
 	group->group_id=0;
 	group->unit_count=0;