public static void QueueWrite(Stream stream, byte[] data, long fileOffset, int dataOffset, long length, DiskIOWriteCallback callback, object state) { while (WriteQueue.Count > MaxPendingOps) { Thread.Sleep(10); } DiskIOWriteState writeData = WriteCache.Get().Init(stream, data, fileOffset, dataOffset, length, callback, state); WriteQueue.Enqueue(writeData); if (WriteQueue.Count > MinPendingOps) { IOHandle.Set(); } }
private static void Write(DiskIOWriteState state) { try { lock (state.Data) { if (!state.Stream.CanWrite) { throw new TorrentException("Stream unwritable."); } state.Stream.Seek(state.FileOffset, SeekOrigin.Begin); state.Stream.Write(state.Data, state.DataOffset, (int)state.Length); state.Callback(true, (int)state.Length, state.State); WriteCache.Put(state); } } catch (Exception) { state.Callback(false, 0, state.State); WriteCache.Put(state); } }
private static void Write(DiskIOWriteState state) { try { lock (state.Data) { if (!state.Stream.CanWrite) throw new TorrentException("Stream unwritable."); state.Stream.Seek(state.FileOffset, SeekOrigin.Begin); state.Stream.Write(state.Data, state.DataOffset, (int)state.Length); state.Callback(true, (int)state.Length, state.State); WriteCache.Put(state); } } catch (Exception) { state.Callback(false, 0, state.State); WriteCache.Put(state); } }