Author: alanmc
Date: 2008-02-09 20:50:57 -0500 (Sat, 09 Feb 2008)
New Revision: 95352

Added:
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/PieceData.cs
Removed:
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/BufferedFileWrite.cs
Modified:
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/EventArgs/BlockEventArgs.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/DiskManager.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/FileManager.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/PieceManager.cs
   
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/StandardMessages/PieceMessage.cs
   
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PiecePicking/PiecePickerBase.cs
   
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PiecePicking/StandardPicker.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/DiskWriter.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/IPieceWriter.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/MemoryWriter.cs
   trunk/bitsharp/src/SampleClient/TestManualConnection.cs
Log:
Refactored the way i keep track of the data for AsyncWrites. Much cleaner now.

Deleted: trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/BufferedFileWrite.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/BufferedFileWrite.cs      
2008-02-10 01:47:53 UTC (rev 95351)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/BufferedFileWrite.cs      
2008-02-10 01:50:57 UTC (rev 95352)
@@ -1,42 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using MonoTorrent.Common;
-using System.Threading;
-using MonoTorrent.Client.Messages;
-
-namespace MonoTorrent.Client
-{
-    public class BufferedIO
-    {
-        #region Fields
-        
-        public ArraySegment<byte> Buffer;
-        internal PeerIdInternal Id;
-        public PeerMessage Message;
-        public Piece Piece;
-        public ManualResetEvent WaitHandle;
-
-               #endregion Fields
-
-
-               #region Constructors
-
-        internal BufferedIO(PeerIdInternal id, ArraySegment<byte> buffer, 
PeerMessage message, Piece piece)
-            : this(id, buffer, message, piece, null)
-        {
-     
-        }
-
-        internal BufferedIO(PeerIdInternal id, ArraySegment<byte> buffer, 
PeerMessage message, Piece piece, ManualResetEvent handle)
-        {
-            this.Id = id;
-            this.Buffer = buffer;
-            this.Message = message;
-            this.Piece = piece;
-            this.WaitHandle = handle;
-        }
-        
-               #endregion Constructors
-    }
-}

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/EventArgs/BlockEventArgs.cs
===================================================================
--- 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/EventArgs/BlockEventArgs.cs   
    2008-02-10 01:47:53 UTC (rev 95351)
+++ 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/EventArgs/BlockEventArgs.cs   
    2008-02-10 01:50:57 UTC (rev 95352)
@@ -56,16 +56,28 @@
         internal BlockEventArgs(TorrentManager manager, Block block, Piece 
piece, PeerId id)
             : base(manager)
         {
-            this.block = block;
-            this.id = id;
-            this.piece = piece;
+            Init(block, piece, id);
         }
 
+        internal BlockEventArgs(PieceData data)
+            : base(data.Id.TorrentManager)
+        {
+            Block b = 
data.Piece[PiecePickerBase.GetBlockIndex(data.Piece.Blocks, data.StartOffset, 
data.Count)];
+            Init(b, data.Piece, data.Id.PublicId);
+        }
         internal BlockEventArgs(TorrentManager manager, Block block, Piece 
piece, PeerIdInternal id)
-            :this(manager, block, piece, id.PublicId)
+            : base(manager)
         {
+            Init(block, piece, id.PublicId);
         }
 
+        private void Init(Block block, Piece piece, PeerId id)
+        {
+            this.block = block;
+            this.id = id;
+            this.piece = piece;
+        }
+
         #endregion
 
 

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/DiskManager.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/DiskManager.cs   
2008-02-10 01:47:53 UTC (rev 95351)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/DiskManager.cs   
2008-02-10 01:50:57 UTC (rev 95352)
@@ -15,7 +15,7 @@
         #region Member Variables
 
         Queue<BufferedFileRead> bufferedReads;
-        Queue<BufferedIO> bufferedWrites;
+        Queue<PieceData> bufferedWrites;
         private ClientEngine engine;
 
         private ConnectionMonitor monitor;
@@ -76,7 +76,7 @@
         internal DiskManager(ClientEngine engine, IPieceWriter writer)
         {
             this.bufferedReads = new Queue<BufferedFileRead>();
-            this.bufferedWrites = new Queue<BufferedIO>();
+            this.bufferedWrites = new Queue<PieceData>();
             this.engine = engine;
             this.ioActive = true;
             this.ioThread = new Thread(new ThreadStart(RunIO));
@@ -113,26 +113,21 @@
         /// Performs the buffered write
         /// </summary>
         /// <param name="bufferedFileIO"></param>
-        private void PerformWrite(BufferedIO bufferedFileIO)
+        private void PerformWrite(PieceData data)
         {
-            PeerIdInternal id = bufferedFileIO.Id;
-            ArraySegment<byte> recieveBuffer = bufferedFileIO.Buffer;
-            PieceMessage message = (PieceMessage)bufferedFileIO.Message;
-            Piece piece = bufferedFileIO.Piece;
+            PeerIdInternal id = data.Id;
+            ArraySegment<byte> recieveBuffer = data.Buffer;
+            Piece piece = data.Piece;
 
             // Find the block that this data belongs to and set it's state to 
"Written"
-            int index = PiecePickerBase.GetBlockIndex(piece.Blocks, 
message.StartOffset, message.RequestLength);
+            int index = data.BlockIndex;
 
             // Perform the actual write
             using (new ReaderLock(this.streamsLock))
-            {
-                // Calculate the index where we will start to write the data
-                long writeIndex = (long)message.PieceIndex * 
message.PieceLength + message.StartOffset;
-                writer.Write(bufferedFileIO, recieveBuffer.Array, 
recieveBuffer.Offset, writeIndex, message.RequestLength);
-            }
+                writer.Write(data);
 
             piece.Blocks[index].Written = true;
-            id.TorrentManager.FileManager.RaiseBlockWritten(new 
BlockEventArgs(id.TorrentManager, piece.Blocks[index], piece, id));
+            id.TorrentManager.FileManager.RaiseBlockWritten(new 
BlockEventArgs(data));
 
             // Release the buffer back into the buffer manager.
             //ClientEngine.BufferManager.FreeBuffer(ref bufferedFileIO.Buffer);
@@ -144,7 +139,7 @@
 
             // Hashcheck the piece as we now have all the blocks.
             bool result = 
id.TorrentManager.Torrent.Pieces.IsValid(id.TorrentManager.FileManager.GetHash(piece.Index,
 false), piece.Index);
-            id.TorrentManager.Bitfield[message.PieceIndex] = result;
+            id.TorrentManager.Bitfield[data.PieceIndex] = result;
             lock (id.TorrentManager.PieceManager.UnhashedPieces)
                 id.TorrentManager.PieceManager.UnhashedPieces[piece.Index] = 
false;
 
@@ -182,7 +177,6 @@
             return writer.Read(fileManager, buffer, bufferOffset, 
pieceStartIndex, bytesToRead);
         }
 
-
         /// <summary>
         /// Queues a block of data to be written asynchronously
         /// </summary>
@@ -190,18 +184,11 @@
         /// <param name="recieveBuffer">The array containing the block</param>
         /// <param name="message">The PieceMessage</param>
         /// <param name="piece">The piece that the block to be written is part 
of</param>
-        internal void QueueWrite(PeerIdInternal id, ArraySegment<byte> 
recieveBuffer, PieceMessage message, Piece piece)
+        internal void QueueWrite(PieceData data)
         {
             lock (this.queueLock)
             {
-                // Request a new buffer from the buffermanager and copy the 
data from the receive buffer
-                // into this new buffer. This is needed as the main code will 
automatically release the receive buffer
-                // and we will lose the data.
-                ArraySegment<byte> buffer = BufferManager.EmptyBuffer;
-                ClientEngine.BufferManager.GetBuffer(ref buffer, 
recieveBuffer.Count);
-                Buffer.BlockCopy(recieveBuffer.Array, recieveBuffer.Offset, 
buffer.Array, buffer.Offset, recieveBuffer.Count);
-
-                bufferedWrites.Enqueue(new BufferedIO(id, buffer, message, 
piece));
+                bufferedWrites.Enqueue(data);
                 SetHandleState(true);
             }
         }
@@ -222,7 +209,7 @@
         /// </summary>
         private void RunIO()
         {
-            BufferedIO write;
+            PieceData write;
             BufferedFileRead read;
             while (ioActive)
             {

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/FileManager.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/FileManager.cs   
2008-02-10 01:47:53 UTC (rev 95351)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/FileManager.cs   
2008-02-10 01:50:57 UTC (rev 95352)
@@ -319,9 +319,9 @@
         /// <param name="recieveBuffer">The array containing the block</param>
         /// <param name="message">The PieceMessage</param>
         /// <param name="piece">The piece that the block to be written is part 
of</param>
-        internal void QueueWrite(PeerIdInternal id, ArraySegment<byte> 
recieveBuffer, PieceMessage message, Piece piece)
+        internal void QueueWrite(PieceData data)
         {
-            manager.Engine.DiskManager.QueueWrite(id, recieveBuffer, message, 
piece);
+            manager.Engine.DiskManager.QueueWrite(data);
         }
 
 

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/PieceManager.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/PieceManager.cs  
2008-02-10 01:47:53 UTC (rev 95351)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Managers/PieceManager.cs  
2008-02-10 01:50:57 UTC (rev 95352)
@@ -186,10 +186,9 @@
             this.piecePicker.RemoveRequests(id);
         }
 
-
-        internal PieceEvent ReceivedPieceMessage(PeerIdInternal id, 
ArraySegment<byte> buffer, PieceMessage message)
+        internal PieceEvent ReceivedPieceMessage(PieceData data)
         {
-            return this.piecePicker.ReceivedPieceMessage(id, buffer, message);
+            return this.piecePicker.ReceivedPieceMessage(data);
         }
 
         internal void Reset()

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/StandardMessages/PieceMessage.cs
===================================================================
--- 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/StandardMessages/PieceMessage.cs
 2008-02-10 01:47:53 UTC (rev 95351)
+++ 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/StandardMessages/PieceMessage.cs
 2008-02-10 01:50:57 UTC (rev 95352)
@@ -34,9 +34,6 @@
 
 namespace MonoTorrent.Client.Messages.Standard
 {
-    /// <summary>
-    /// 
-    /// </summary>
     public class PieceMessage : PeerMessage
     {
         public const byte MessageId = 7;
@@ -148,6 +145,7 @@
 
             this.dataOffset = offset;
 
+            // This buffer will be freed after the PieceWriter has finished 
with it
             this.data = BufferManager.EmptyBuffer;
             ClientEngine.BufferManager.GetBuffer(ref this.data, requestLength);
             Buffer.BlockCopy(buffer, offset, this.data.Array, 
this.data.Offset, requestLength);
@@ -209,22 +207,16 @@
         /// <param name="id">The Peer who's message will be handled</param>
         internal override void Handle(PeerIdInternal id)
         {
-            try
-            {
-                id.TorrentManager.PieceManager.ReceivedPieceMessage(id, 
this.data, this);
+            PieceData d = new PieceData(data, pieceIndex, startOffset, 
requestLength, id);
+            id.TorrentManager.PieceManager.ReceivedPieceMessage(d);
 
-                // Keep adding new piece requests to this peers queue until we 
reach the max pieces we're allowed queue
-                while (id.TorrentManager.PieceManager.AddPieceRequest(id)) { }
+            // Keep adding new piece requests to this peers queue until we 
reach the max pieces we're allowed queue
+            while (id.TorrentManager.PieceManager.AddPieceRequest(id)) { }
 
-                if (!id.Connection.ProcessingQueue)
-                {
-                    id.Connection.ProcessingQueue = true;
-                    id.ConnectionManager.MessageHandler.EnqueueSend(id);
-                }
-            }
-            finally
+            if (!id.Connection.ProcessingQueue)
             {
-                ClientEngine.BufferManager.FreeBuffer(ref this.data);
+                id.Connection.ProcessingQueue = true;
+                id.ConnectionManager.MessageHandler.EnqueueSend(id);
             }
         }
 

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PiecePicking/PiecePickerBase.cs
===================================================================
--- 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PiecePicking/PiecePickerBase.cs
   2008-02-10 01:47:53 UTC (rev 95351)
+++ 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PiecePicking/PiecePickerBase.cs
   2008-02-10 01:50:57 UTC (rev 95352)
@@ -69,7 +69,7 @@
         public abstract RequestMessage PickPiece(PeerIdInternal id, 
List<PeerIdInternal> otherPeers);
         public abstract void ReceivedChokeMessage(PeerIdInternal id);
         public abstract void ReceivedRejectRequest(PeerIdInternal id, 
RejectRequestMessage message);
-        public abstract PieceEvent ReceivedPieceMessage(PeerIdInternal id, 
ArraySegment<byte> buffer, PieceMessage message);
+        public abstract PieceEvent ReceivedPieceMessage(PieceData data);
         public abstract void RemoveRequests(PeerIdInternal id);
         public abstract void Reset();
 

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PiecePicking/StandardPicker.cs
===================================================================
--- 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PiecePicking/StandardPicker.cs
    2008-02-10 01:47:53 UTC (rev 95351)
+++ 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PiecePicking/StandardPicker.cs
    2008-02-10 01:50:57 UTC (rev 95352)
@@ -588,19 +588,21 @@
         /// <param name="offset"></param>
         /// <param name="writeIndex"></param>
         /// <param name="p"></param>
-        public override PieceEvent ReceivedPieceMessage(PeerIdInternal id, 
ArraySegment<byte> recieveBuffer, PieceMessage message)
+        public override PieceEvent ReceivedPieceMessage(PieceData data)
         {
+            PeerIdInternal id = data.Id;
             lock (this.requests)
             {
-                Piece piece = requests.Find(delegate(Piece p) { return p.Index 
== message.PieceIndex; });
+                Piece piece = requests.Find(delegate(Piece p) { return p.Index 
== data.PieceIndex; });
+                data.Piece = piece;
                 if (piece == null)
                 {
-                    Logger.Log(id.Connection.Connection, "Received block from 
unrequested piece");
+                    Logger.Log(data.Id.Connection.Connection, "Received block 
from unrequested piece");
                     return PieceEvent.BlockNotRequested;
                 }
 
                 // Pick out the block that this piece message belongs to
-                int blockIndex = PiecePickerBase.GetBlockIndex(piece.Blocks, 
message.StartOffset, message.RequestLength);
+                int blockIndex = PiecePickerBase.GetBlockIndex(piece.Blocks, 
data.StartOffset, data.Count);
                 if (blockIndex == -1 || 
!id.Equals(piece.Blocks[blockIndex].RequestedOff))
                 {
                     Logger.Log(id.Connection.Connection, "Invalid block start 
offset returned");
@@ -623,8 +625,8 @@
 
                 piece.Blocks[blockIndex].Received = true;
                 id.Connection.AmRequestingPiecesCount--;
-                id.TorrentManager.PieceManager.RaiseBlockReceived(new 
BlockEventArgs(id.TorrentManager, piece.Blocks[blockIndex], piece, id));
-                id.TorrentManager.FileManager.QueueWrite(id, recieveBuffer, 
message, piece);
+                id.TorrentManager.PieceManager.RaiseBlockReceived(new 
BlockEventArgs(data));
+                id.TorrentManager.FileManager.QueueWrite(data);
 
                 if (piece.AllBlocksReceived)
                 {

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/DiskWriter.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/DiskWriter.cs 
2008-02-10 01:47:53 UTC (rev 95351)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/DiskWriter.cs 
2008-02-10 01:50:57 UTC (rev 95352)
@@ -88,9 +88,13 @@
             return totalRead;
         }
 
-        public void Write(BufferedIO io, byte[] buffer, int bufferOffset, long 
offset, int count)
+        public void Write(PieceData data)
         {
-            FileManager manager = io.Id.TorrentManager.FileManager;
+            byte[] buffer = data.Buffer.Array;
+            long offset = data.WriteOffset;
+            int count = data.Count;
+
+            FileManager manager = data.Id.TorrentManager.FileManager;
             if (buffer == null)
                 throw new ArgumentNullException("buffer");
 
@@ -128,7 +132,7 @@
                     bytesWritten = ((count - totalWritten) > bytesWeCanWrite) 
? bytesWeCanWrite : (count - totalWritten);
 
                     // Write the data
-                    stream.Write(buffer, bufferOffset + (int)totalWritten, 
(int)bytesWritten);
+                    stream.Write(buffer, data.Buffer.Offset + 
(int)totalWritten, (int)bytesWritten);
                     stream.Flush();
 
                     // Any further data should be written to the next 
available file

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/IPieceWriter.cs
===================================================================
--- 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/IPieceWriter.cs   
    2008-02-10 01:47:53 UTC (rev 95351)
+++ 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/IPieceWriter.cs   
    2008-02-10 01:50:57 UTC (rev 95352)
@@ -9,7 +9,7 @@
     {
         int Read(FileManager manager, byte[] buffer, int bufferOffset, long 
offset, int count);
         
-        void Write(BufferedIO io, byte[] buffer, int bufferOffset, long 
offset, int count);
+        void Write(PieceData data);
 
         void CloseFileStreams(TorrentManager manager);
 

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/MemoryWriter.cs
===================================================================
--- 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/MemoryWriter.cs   
    2008-02-10 01:47:53 UTC (rev 95351)
+++ 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/MemoryWriter.cs   
    2008-02-10 01:50:57 UTC (rev 95352)
@@ -6,29 +6,10 @@
 
 namespace MonoTorrent.Client.PieceWriter
 {
-    internal class MemIO
-    {
-        public FileManager manager;
-        public byte[] buffer;
-        public int bufferOffset;
-        public long offset;
-        public int count;
-        public BufferedIO io;
-
-        public MemIO(FileManager manager, BufferedIO io, byte[] buffer, int 
bufferOffset, long offset, int count)
-        {
-            this.manager = manager;
-            this.io = io;
-            this.buffer = buffer;
-            this.bufferOffset = bufferOffset;
-            this.offset = offset;
-            this.count = count;
-        }
-    }
     public class MemoryWriter : IPieceWriter
     {
         private int capacity;
-        private List<MemIO> memoryBuffer;
+        private List<PieceData> memoryBuffer;
         private IPieceWriter writer;
 
 
@@ -42,7 +23,7 @@
             get
             {
                 int count = 0;
-                memoryBuffer.ForEach(delegate(MemIO i) { count += i.count; });
+                memoryBuffer.ForEach(delegate(PieceData i) { count += i.Count; 
});
                 return count;
             }
         }
@@ -61,7 +42,7 @@
             if (capacity < 0)
                 throw new ArgumentOutOfRangeException("capacity");
 
-            memoryBuffer = new List<MemIO>();
+            memoryBuffer = new List<PieceData>();
             this.capacity = capacity;
             this.writer = writer;
         }
@@ -77,12 +58,12 @@
             int origCount = count;
             while (count != 0)
             {
-                memoryBuffer.Sort(delegate(MemIO left, MemIO right) { return 
left.offset.CompareTo(right.offset); });
-                MemIO io = memoryBuffer.Find(delegate(MemIO m) { return 
((offset >= m.offset) && (offset < (m.offset + m.count))); });
+                memoryBuffer.Sort(delegate(PieceData left, PieceData right) { 
return left.WriteOffset.CompareTo(right.WriteOffset); });
+                PieceData io = memoryBuffer.Find(delegate(PieceData m) { 
return ((offset >= m.WriteOffset) && (offset < (m.WriteOffset + m.Count))); });
                 if (io != null)
                 {
-                    int toCopy = Math.Min(count, io.count + (int)(io.offset - 
offset));
-                    Buffer.BlockCopy(io.buffer, io.bufferOffset + 
(int)(io.offset - offset), buffer, bufferOffset + (origCount - count), toCopy);
+                    int toCopy = Math.Min(count, io.Count + 
(int)(io.WriteOffset - offset));
+                    Buffer.BlockCopy(io.Buffer.Array, io.Buffer.Offset + 
(int)(io.WriteOffset - offset), buffer, io.Buffer.Offset + (origCount - count), 
toCopy);
                     offset += toCopy;
                     count -= toCopy;
                 }
@@ -95,37 +76,34 @@
             return writer.Read(manager, buffer, bufferOffset, offset, count) + 
(origCount - count);
         }
 
-        private void Write(MemIO m)
-        {
-            Write(m.io, m.buffer, m.bufferOffset, m.offset, m.count, true);
-        }
 
-
-        public void Write(BufferedIO io, byte[] buffer, int bufferOffset, long 
offset, int count)
+        public void Write(PieceData data)
         {
-            Write(io, buffer, bufferOffset, offset, count, false);
+            Write(data, false);
         }
 
-        public void Write(BufferedIO io, byte[] buffer, int bufferOffset, long 
offset, int count, bool forceWrite)
+        public void Write(PieceData data, bool forceWrite)
         {
             if (forceWrite)
             {
-                writer.Write(io, buffer, bufferOffset, offset, count);
+                writer.Write(data);
                 return;
             }
 
-            if (Used >= (Capacity - count))
+            if (Used >= (Capacity - data.Count))
                 FlushSome();
 
-            memoryBuffer.Add(new MemIO(io.Id.TorrentManager.FileManager, io, 
buffer, bufferOffset, offset, count));
+            memoryBuffer.Add(data);
         }
 
         private void FlushSome()
         {
             int count = Math.Min(5, memoryBuffer.Count);
             for (int i = 0; i < count; i++)
-                Write(memoryBuffer[i]);
-
+            {
+                Write(memoryBuffer[i], true);
+                ClientEngine.BufferManager.FreeBuffer(ref 
memoryBuffer[i].Buffer);
+            }
             memoryBuffer.RemoveRange(0, count);
         }
 
@@ -140,8 +118,15 @@
 
         public void Flush(TorrentManager manager)
         {
-            memoryBuffer.ForEach(delegate(MemIO io) { if (io.manager == 
manager.FileManager) Write(io); });
-            memoryBuffer.RemoveAll(delegate(MemIO io) { return io.manager == 
manager.FileManager; });
+            memoryBuffer.ForEach(delegate(PieceData io)
+            {
+                if (io.Manager != manager.FileManager)
+                    return;
+
+                Write(io, true);
+                ClientEngine.BufferManager.FreeBuffer(ref io.Buffer);
+            });
+            memoryBuffer.RemoveAll(delegate(PieceData io) { return io.Manager 
== manager.FileManager; });
         }
     }
 }

Added: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/PieceData.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/PieceData.cs  
2008-02-10 01:47:53 UTC (rev 95351)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/PieceData.cs  
2008-02-10 01:50:57 UTC (rev 95352)
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace MonoTorrent.Client
+{
+    public class PieceData
+    {
+        public ArraySegment<byte> Buffer;
+        private int count;
+        private PeerIdInternal id;
+        private Piece piece;
+        private int pieceIndex;
+        private int startOffset;
+
+
+        public int BlockIndex
+        {
+            get { return PiecePickerBase.GetBlockIndex(piece.Blocks, 
startOffset, count); }
+        }
+
+        public int Count
+        {
+           get { return count; }
+        }
+
+        internal PeerIdInternal Id
+        {
+            get { return id; }
+        }
+
+        public FileManager Manager
+        {
+            get { return id.TorrentManager.FileManager; }
+        }
+
+        public Piece Piece
+        {
+            get { return piece; }
+            set { piece = value; }
+        }
+
+        public int PieceIndex
+        {
+            get { return pieceIndex; }
+        }
+
+        public int StartOffset
+        {
+            get { return startOffset; }
+        }
+
+        public long WriteOffset
+        {
+            get { return (long)id.TorrentManager.Torrent.PieceLength * 
pieceIndex + startOffset; }
+        }
+
+
+        internal PieceData(ArraySegment<byte> buffer, int pieceIndex, int 
startOffset, int count, PeerIdInternal id)
+        {
+            this.Buffer = buffer;
+            this.count = count;
+            this.id = id;
+            this.pieceIndex = pieceIndex;
+            this.startOffset = startOffset;
+        }
+    }
+}


Property changes on: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/PieceWriter/PieceData.cs
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/bitsharp/src/SampleClient/TestManualConnection.cs
===================================================================
--- trunk/bitsharp/src/SampleClient/TestManualConnection.cs     2008-02-10 
01:47:53 UTC (rev 95351)
+++ trunk/bitsharp/src/SampleClient/TestManualConnection.cs     2008-02-10 
01:50:57 UTC (rev 95352)
@@ -143,9 +143,9 @@
         public EngineTestRig(string savePath)
         {
             listener = new CustomListener();
-            engine = new ClientEngine(EngineSettings.DefaultSettings(), 
listener);
+            engine = new ClientEngine(new EngineSettings(), listener);
             torrent = Torrent.Load(CreateTorrent());
-            manager = new TorrentManager(torrent, savePath, 
TorrentSettings.DefaultSettings());
+            manager = new TorrentManager(torrent, savePath, new 
TorrentSettings());
             engine.Register(manager);
             manager.Start();
         }

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

Reply via email to