public void Dispose() { if (_buffer == null) { return; } _parent._managedBuffers.Push(_buffer); _buffer = null; }
public async ValueTask <BlittableJsonReaderObject> ParseToMemoryAsync(WebSocket webSocket, string debugTag, BlittableJsonDocumentBuilder.UsageMode mode, ManagedPinnedBuffer bytes, CancellationToken token = default(CancellationToken) ) { if (_disposed) { ThrowObjectDisposed(); } _jsonParserState.Reset(); UnmanagedJsonParser parser = null; BlittableJsonDocumentBuilder builder = null; var generation = _generation; try { parser = new UnmanagedJsonParser(this, _jsonParserState, debugTag); builder = new BlittableJsonDocumentBuilder(this, mode, debugTag, parser, _jsonParserState); CachedProperties.NewDocument(); builder.ReadObjectDocument(); while (true) { if (bytes.Valid == bytes.Used) { var read = await webSocket.ReceiveAsync(bytes.Buffer, token); EnsureNotDisposed(); if (read.Count == 0) { throw new EndOfStreamException("Stream ended without reaching end of json content"); } bytes.Valid = read.Count; bytes.Used = 0; } parser.SetBuffer(bytes); var result = builder.Read(); bytes.Used += parser.BufferOffset; if (result) { break; } } builder.FinalizeDocument(); var reader = builder.CreateReader(); return(reader); } finally { DisposeIfNeeded(generation, parser, builder); } }
public ReturnBuffer GetManagedBuffer(out ManagedPinnedBuffer buffer) { if (_managedBuffers == null) { _managedBuffers = new Stack <ManagedPinnedBuffer>(); } if (_managedBuffers.Count == 0) { ManagedPinnedBuffer.Add(_managedBuffers); } buffer = _managedBuffers.Pop(); return(new ReturnBuffer(buffer, this)); }
public void Dispose() { if (_buffer == null) { return; } //_parent disposal sets _managedBuffers to null, //throwing ObjectDisposedException() to make it more visible if (_parent._disposed) { ThrowParentWasDisposed(); } _parent._managedBuffers.Push(_buffer); _buffer = null; }
public BlittableJsonReaderObject ParseToMemory(Stream stream, string debugTag, BlittableJsonDocumentBuilder.UsageMode mode, ManagedPinnedBuffer bytes, IBlittableDocumentModifier modifier = null) { if (_disposed) { ThrowObjectDisposed(); } _jsonParserState.Reset(); using (var parser = new UnmanagedJsonParser(this, _jsonParserState, debugTag)) using (var builder = new BlittableJsonDocumentBuilder(this, mode, debugTag, parser, _jsonParserState, modifier: modifier)) { CachedProperties.NewDocument(); builder.ReadObjectDocument(); while (true) { if (bytes.Valid == bytes.Used) { var read = stream.Read(bytes.Buffer.Array, bytes.Buffer.Offset, bytes.Length); EnsureNotDisposed(); if (read == 0) { throw new EndOfStreamException("Stream ended without reaching end of json content"); } bytes.Valid = read; bytes.Used = 0; } parser.SetBuffer(bytes); var result = builder.Read(); bytes.Used += parser.BufferOffset; if (result) { break; } } builder.FinalizeDocument(); var reader = builder.CreateReader(); return(reader); } }
public async ValueTask <BlittableJsonReaderObject> ParseToMemoryAsync(Stream stream, string documentId, BlittableJsonDocumentBuilder.UsageMode mode, ManagedPinnedBuffer bytes, CancellationToken?token = null, int maxSize = int.MaxValue) { if (_disposed) { ThrowObjectDisposed(); } _jsonParserState.Reset(); UnmanagedJsonParser parser = null; BlittableJsonDocumentBuilder builder = null; var generation = _generation; var streamDisposer = token?.Register(stream.Dispose); try { parser = new UnmanagedJsonParser(this, _jsonParserState, documentId); builder = new BlittableJsonDocumentBuilder(this, mode, documentId, parser, _jsonParserState); CachedProperties.NewDocument(); builder.ReadObjectDocument(); while (true) { token?.ThrowIfCancellationRequested(); if (bytes.Valid == bytes.Used) { var read = token.HasValue ? await stream.ReadAsync(bytes.Buffer.Array, bytes.Buffer.Offset, bytes.Length, token.Value) : await stream.ReadAsync(bytes.Buffer.Array, bytes.Buffer.Offset, bytes.Length); EnsureNotDisposed(); if (read == 0) { throw new EndOfStreamException("Stream ended without reaching end of json content"); } bytes.Valid = read; bytes.Used = 0; maxSize -= read; if (maxSize < 0) { throw new ArgumentException($"The maximum size allowed for {documentId} ({maxSize}) has been exceeded, aborting"); } } parser.SetBuffer(bytes); var result = builder.Read(); bytes.Used += parser.BufferOffset; if (result) { break; } } builder.FinalizeDocument(); var reader = builder.CreateReader(); return(reader); } finally { streamDisposer?.Dispose(); DisposeIfNeeded(generation, parser, builder); } }
public ReturnBuffer(ManagedPinnedBuffer buffer, JsonOperationContext parent) { _buffer = buffer; _parent = parent; }