浏览代码

BETA: Possible deadlock Thanks JIV

Rumen Nikiforov 13 年之前
父节点
当前提交
ac2c6aee71

+ 9 - 15
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/ItemContainer.java

@@ -46,14 +46,17 @@ public abstract class ItemContainer
 	
 	protected ItemContainer()
 	{
-		_items = new FastList<L2ItemInstance>();
+		_items = new FastList<L2ItemInstance>().shared();
 	}
 	
 	protected abstract L2Character getOwner();
 	
 	protected abstract ItemLocation getBaseLocation();
 	
-	public String getName() { return "ItemContainer"; }
+	public String getName()
+	{
+		return "ItemContainer";
+	}
 	
 	/**
 	 * Returns the ownerID of the inventory
@@ -79,10 +82,7 @@ public abstract class ItemContainer
 	 */
 	public L2ItemInstance[] getItems()
 	{
-		synchronized (_items)
-		{
-			return _items.toArray(new L2ItemInstance[_items.size()]);
-		}
+		return _items.toArray(new L2ItemInstance[_items.size()]);
 	}
 	
 	/**
@@ -480,7 +480,7 @@ public abstract class ItemContainer
 	 * @param actor : L2PcInstance Player requesting the item destroy
 	 * @param reference : Object Object referencing current action like NPC selling item or previous item in transformation
 	 */
-	public synchronized void destroyAllItems(String process, L2PcInstance actor, Object reference)
+	public void destroyAllItems(String process, L2PcInstance actor, Object reference)
 	{
 		for (L2ItemInstance item : _items)
 		{
@@ -515,10 +515,7 @@ public abstract class ItemContainer
 	 */
 	protected void addItem(L2ItemInstance item)
 	{
-		synchronized (_items)
-		{
-			_items.add(item);
-		}
+		_items.add(item);
 	}
 	
 	/**
@@ -528,10 +525,7 @@ public abstract class ItemContainer
 	 */
 	protected boolean removeItem(L2ItemInstance item)
 	{
-		synchronized (_items)
-		{
-			return _items.remove(item);
-		}
+		return _items.remove(item);
 	}
 	
 	/**

+ 32 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java

@@ -50,6 +50,8 @@ public class PcInventory extends Inventory
 	private int[] _blockItems = null;
 	
 	private int _questSlots;
+	
+	private final Object _lock;
 	/**
 	 * Block modes:
 	 * <UL>
@@ -63,18 +65,37 @@ public class PcInventory extends Inventory
 	public PcInventory(L2PcInstance owner)
 	{
 		_owner = owner;
+		_lock = new Object();
 	}
 	
 	@Override
-	public L2PcInstance getOwner() { return _owner; }
+	public L2PcInstance getOwner()
+	{
+		return _owner;
+	}
+	
 	@Override
-	protected ItemLocation getBaseLocation() { return ItemLocation.INVENTORY; }
+	protected ItemLocation getBaseLocation()
+	{
+		return ItemLocation.INVENTORY;
+	}
+	
 	@Override
-	protected ItemLocation getEquipLocation() { return ItemLocation.PAPERDOLL; }
+	protected ItemLocation getEquipLocation()
+	{
+		return ItemLocation.PAPERDOLL;
+	}
+	
+	public L2ItemInstance getAdenaInstance()
+	{
+		return _adena;
+	}
 	
-	public L2ItemInstance getAdenaInstance() {return _adena;}
 	@Override
-	public long getAdena() {return _adena != null ? _adena.getCount() : 0;}
+	public long getAdena()
+	{
+		return _adena != null ? _adena.getCount() : 0;
+	}
 	
 	public L2ItemInstance getAncientAdenaInstance()
 	{
@@ -646,9 +667,9 @@ public class PcInventory extends Inventory
 		else if (item.getItemId() == ANCIENT_ADENA_ID)
 			_ancientAdena = null;
 		
-		synchronized(_items)
+		if (item.isQuestItem())
 		{
-			if (item.isQuestItem())
+			synchronized (_lock)
 			{
 				_questSlots--;
 				if (_questSlots < 0)
@@ -657,8 +678,8 @@ public class PcInventory extends Inventory
 					_log.warning(this + ": QuestInventory size < 0!");
 				}
 			}
-			return super.removeItem(item);
 		}
+		return super.removeItem(item);
 	}
 	
 	/**
@@ -890,14 +911,14 @@ public class PcInventory extends Inventory
 	@Override
 	protected void addItem(L2ItemInstance item)
 	{
-		synchronized(_items)
+		if (item.isQuestItem())
 		{
-			if (item.isQuestItem())
+			synchronized (_lock)
 			{
 				_questSlots++;
 			}
-			super.addItem(item);
 		}
+		super.addItem(item);
 	}
 	
 	public int getSize(boolean quest)

+ 2 - 6
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/PcRefund.java

@@ -28,7 +28,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  */
 public class PcRefund extends ItemContainer
 {
-	private L2PcInstance _owner;
+	private final L2PcInstance _owner;
 	
 	public PcRefund(L2PcInstance owner)
 	{
@@ -61,11 +61,7 @@ public class PcRefund extends ItemContainer
 		{
 			if (getSize() > 12)
 			{
-				L2ItemInstance removedItem;
-				synchronized (_items)
-				{
-					removedItem = _items.remove(0);
-				}
+				L2ItemInstance removedItem = _items.remove(0);
 				if (removedItem != null)
 				{
 					ItemTable.getInstance().destroyItem("ClearRefund", removedItem, getOwner(), null);