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