// private methods private void ReleaseChunk(ReferenceCountedChunk chunk) { if (!_disposed) { lock (_lock) { if (_chunks.Count < _maxChunkCount) { _chunks.Push(chunk); } // otherwise just let it get garbage collected } } }
/// <inheritdoc/> public IBsonChunk GetChunk(int requestedSize) { ThrowIfDisposed(); ReferenceCountedChunk referenceCountedChunk = null; lock (_lock) { if (_chunks.Count > 0) { referenceCountedChunk = _chunks.Pop(); } } if (referenceCountedChunk == null) { var chunk = new byte[_chunkSize]; referenceCountedChunk = new ReferenceCountedChunk(chunk, this); } return(new DisposableChunk(referenceCountedChunk)); }
// constructors public DisposableChunk(ReferenceCountedChunk referenceCountedChunk) { _referenceCountedChunk = referenceCountedChunk; _referenceCountedChunk.IncrementReferenceCount(); }
/// <inheritdoc/> public IBsonChunk GetChunk(int requestedSize) { ThrowIfDisposed(); ReferenceCountedChunk referenceCountedChunk = null; lock (_lock) { if (_chunks.Count > 0) { referenceCountedChunk = _chunks.Pop(); } } if (referenceCountedChunk == null) { var chunk = new byte[_chunkSize]; referenceCountedChunk = new ReferenceCountedChunk(chunk, this); } return new DisposableChunk(referenceCountedChunk); }