Author: alanmc
Date: 2007-03-23 10:08:54 -0500 (Fri, 23 Mar 2007)
New Revision: 74878

Modified:
   trunk/bitsharp/src/MonoTorrent.Client/Managers/FileManager.cs
   trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/EndGamePicker.cs
   trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/PiecePickerBase.cs
   trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/StandardPicker.cs
Log:
Updated code to properly access the blocks via their index in the piece.

Modified: trunk/bitsharp/src/MonoTorrent.Client/Managers/FileManager.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent.Client/Managers/FileManager.cs       
2007-03-23 14:56:28 UTC (rev 74877)
+++ trunk/bitsharp/src/MonoTorrent.Client/Managers/FileManager.cs       
2007-03-23 15:08:54 UTC (rev 74878)
@@ -342,9 +342,8 @@
             this.Write(recieveBuffer, message.DataOffset, writeIndex, 
message.BlockLength);
 
             // Find the block that this data belongs to and set it's state to 
"Written"
-            Block block = PiecePickerBase.GetBlockFromIndex(piece.Blocks, 
message.StartOffset, message.BlockLength);
-            block.Written = true;
-            PiecePickerBase.SetBlock(piece.Blocks, block);
+            int index = PiecePickerBase.GetBlockIndex(piece.Blocks, 
message.StartOffset, message.BlockLength);
+            piece.Blocks[index].Written = true;
 
             // Release the buffer back into the buffer manager.
             ClientEngine.BufferManager.FreeBuffer(ref bufferedFileIO.Buffer);

Modified: trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/EndGamePicker.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/EndGamePicker.cs 
2007-03-23 14:56:28 UTC (rev 74877)
+++ trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/EndGamePicker.cs 
2007-03-23 15:08:54 UTC (rev 74878)
@@ -193,10 +193,10 @@
         private void RemoveRequests(PeerConnectionID id, RequestMessage 
requestMessage)
         {
             Piece p = PiecePickerBase.GetPieceFromIndex(this.pieces, 
requestMessage.PieceIndex);
-            Block b = PiecePickerBase.GetBlockFromIndex(p.Blocks, 
requestMessage.StartOffset, requestMessage.RequestLength);
+            int b = PiecePickerBase.GetBlockIndex(p.Blocks, 
requestMessage.StartOffset, requestMessage.RequestLength);
 
-            this.requests[id].Remove(b);
-            this.blockRequestees[b].Remove(id);
+            this.requests[id].Remove(p.Blocks[b]);
+            this.blockRequestees[p.Blocks[b]].Remove(id);
         }
 
 
@@ -208,18 +208,17 @@
                 if (p == null)
                     return PieceEvent.BlockNotRequested;
 
-                Block b = PiecePickerBase.GetBlockFromIndex(p.Blocks, 
message.StartOffset, message.BlockLength);
-                if (b.Equals(Block.Empty))
+                int blockIndex = PiecePickerBase.GetBlockIndex(p.Blocks, 
message.StartOffset, message.BlockLength);
+                if (blockIndex == -1)
                     return PieceEvent.BlockNotRequested;
 
                 // Only write to disk once
-                if (!b.Received)
+                if (!p.Blocks[blockIndex].Received)
                 {
                     long writeIndex = (long)message.PieceIndex * 
message.PieceLength + message.StartOffset;
                     id.TorrentManager.FileManager.Write(buffer, 
message.DataOffset, writeIndex, message.BlockLength);
                 }
-                b.Received = true;
-                PiecePickerBase.SetBlock(p.Blocks, b);
+                p.Blocks[blockIndex].Received = true;
 
                 id.Peer.Connection.AmRequestingPiecesCount--;
 
@@ -232,8 +231,8 @@
                 id.TorrentManager.HashedPiece(new 
PieceHashedEventArgs(p.Index, result));
 
                 List<Block> activeRequests = this.requests[id];
-                List<PeerConnectionID> activeRequestees = 
this.blockRequestees[b];
-                activeRequests.Remove(b);
+                List<PeerConnectionID> activeRequestees = 
this.blockRequestees[p.Blocks[blockIndex]];
+                activeRequests.Remove(p.Blocks[blockIndex]);
                 activeRequestees.Remove(id);
 
                 for (int i = 0; i < activeRequestees.Count; i++)
@@ -242,7 +241,7 @@
                             activeRequestees[i].Peer.Connection.EnQueueAt(new 
CancelMessage(message.PieceIndex, message.StartOffset, message.BlockLength), 0);
 
                 activeRequestees.Clear();
-                this.blockRequestees.Remove(b);
+                this.blockRequestees.Remove(p.Blocks[blockIndex]);
 
                 if (result)
                 {
@@ -274,12 +273,12 @@
                 List<Block> pieces = this.requests[id];
 
                 Piece piece = PiecePickerBase.GetPieceFromIndex(this.pieces, 
message.PieceIndex);
-                Block block = PiecePickerBase.GetBlockFromIndex(piece.Blocks, 
message.StartOffset, message.RequestLength);
+                int block = PiecePickerBase.GetBlockIndex(piece.Blocks, 
message.StartOffset, message.RequestLength);
 
-                if (this.requests[id].Contains(block))
+                if (this.requests[id].Contains(piece.Blocks[block]))
                 {
-                    this.requests[id].Remove(block);
-                    this.blockRequestees[block].Remove(id);
+                    this.requests[id].Remove(piece.Blocks[block]);
+                    this.blockRequestees[piece.Blocks[block]].Remove(id);
 
                     id.Peer.Connection.AmRequestingPiecesCount--;
                 }

Modified: trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/PiecePickerBase.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/PiecePickerBase.cs       
2007-03-23 14:56:28 UTC (rev 74877)
+++ trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/PiecePickerBase.cs       
2007-03-23 15:08:54 UTC (rev 74878)
@@ -69,6 +69,15 @@
 
         #region Methods
 
+        internal static int GetBlockIndex(Block[] blocks, int 
blockStartOffset, int blockLength)
+        {
+            for (int i = 0; i < blocks.Length; i++)
+                if (blocks[i].StartOffset == blockStartOffset && 
blocks[i].RequestLength == blockLength)
+                    return i;
+
+            return -1;
+        } 
+
         internal static Piece GetPieceFromIndex(List<Piece> pieces, int 
pieceIndex)
         {
             for (int i = 0; i < pieces.Count; i++)
@@ -78,36 +87,6 @@
             return null;
         }
 
-        internal static Block GetBlockFromIndex(Block[] blocks, int 
blockStartOffset, int blockLength)
-        {
-            for (int i = 0; i < blocks.Length; i++)
-                if (blocks[i].StartOffset == blockStartOffset && 
blocks[i].RequestLength == blockLength)
-                    return blocks[i];
-
-            return Block.Empty;
-        }
-
         #endregion Methods
-
-
-        internal static void SetBlock(Block[] blocks, Block block)
-        {
-            for (int i = 0; i < blocks.Length; i++)
-            {
-                if (blocks[i].StartOffset != block.StartOffset
-                    || blocks[i].RequestLength != block.RequestLength
-                    || blocks[i].PieceIndex != block.PieceIndex)
-                {
-                    continue;
-                }
-                else
-                {
-                    blocks[i] = block;
-                    return;
-                }
-            }
-
-            throw new TorrentException("Cannot update the piece status - 
Invalid block");
-        }
     }
 }

Modified: trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/StandardPicker.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/StandardPicker.cs        
2007-03-23 14:56:28 UTC (rev 74877)
+++ trunk/bitsharp/src/MonoTorrent.Client/PiecePicking/StandardPicker.cs        
2007-03-23 15:08:54 UTC (rev 74878)
@@ -478,29 +478,28 @@
                 }
 
                 // Pick out the block that this piece message belongs to
-                Block block = PiecePickerBase.GetBlockFromIndex(piece.Blocks, 
message.StartOffset, message.BlockLength);
-                if (block.Equals(Block.Empty))
+                int blockIndex = PiecePickerBase.GetBlockIndex(piece.Blocks, 
message.StartOffset, message.BlockLength);
+                if (blockIndex == -1)
                 {
                     Logger.Log(id, "Invalid block start offset returned");
                     return PieceEvent.BlockNotRequested;
                 }
 
-                if (block.Received)
+                if (piece.Blocks[blockIndex].Received)
                 {
                     Logger.Log("Block already received");
                     return PieceEvent.BlockNotRequested;
                 }
                 //throw new MessageException("Block already received");
 
-                if (!block.Requested)
+                if (!piece.Blocks[blockIndex].Requested)
                 {
                     Logger.Log("Block was not requested");
                     return PieceEvent.BlockNotRequested;
                 }
                 //throw new MessageException("Block was not requested");
 
-                block.Received = true;
-                PiecePickerBase.SetBlock(piece.Blocks, block);
+                piece.Blocks[blockIndex].Received = true;
 
                 id.Peer.Connection.AmRequestingPiecesCount--;
                 id.TorrentManager.FileManager.QueueWrite(id, recieveBuffer, 
message, piece);
@@ -559,15 +558,14 @@
                 if (piece == null)
                     throw new MessageException("Received reject request for a 
piece i'm not requesting");
 
-                Block block = PiecePickerBase.GetBlockFromIndex(piece.Blocks, 
rejectRequestMessage.StartOffset, rejectRequestMessage.RequestLength);
-                if (block.Equals(Block.Empty))
+                int blockIndex = PiecePickerBase.GetBlockIndex(piece.Blocks, 
rejectRequestMessage.StartOffset, rejectRequestMessage.RequestLength);
+                if (blockIndex == -1)
                     throw new MessageException("Received reject request for a 
piece i'm not requesting");
 
-                if (!block.Requested || block.Received)
+                if (!piece.Blocks[blockIndex].Requested || 
piece.Blocks[blockIndex].Received)
                     throw new MessageException("We didnt request this block or 
we already received it");
 
-                block.Requested = false;
-                PiecePickerBase.SetBlock(piece.Blocks, block);
+                piece.Blocks[blockIndex].Requested = false;
 
                 id.Peer.Connection.AmRequestingPiecesCount--;
             }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to