private void OnSlabDeallocated(MemoryPoolSlab slab) { IntPtr bufferId; if (_bufferIdMappings.TryRemove(slab.ArrayPtr, out bufferId)) { _rio.DeregisterBuffer(bufferId); } else { Debug.Assert(false, "Unknown buffer id!"); } }
private void OnSlabAllocated(MemoryPoolSlab slab) { lock (_bufferIdMappings) { var memoryPtr = slab.NativePointer; var bufferId = _rio.RioRegisterBuffer(memoryPtr, (uint)slab.Length); var addressLong = memoryPtr.ToInt64(); _bufferIdMappings.Add(new BufferMapping { Id = bufferId, Start = addressLong, End = addressLong + slab.Length }); } }
private void OnSlabDeallocated(MemoryPoolSlab slab) { var memoryPtr = slab.NativePointer; var addressLong = memoryPtr.ToInt64(); lock (_bufferIdMappings) { for (int i = _bufferIdMappings.Count - 1; i >= 0; i--) { if (addressLong == _bufferIdMappings[i].Start) { _bufferIdMappings.RemoveAt(i); break; } } } }
public static RootNode GetSyntaxTree(string path, SourceText text) { var chars = new char[text.Length]; text.CopyTo(0, chars, 0, text.Length); var resolvedEncoding = text.Encoding ?? Encoding.UTF8; var inputFile = resolvedEncoding.GetBytes(chars); var nodes = new List <Node>(); var lines = text.Lines; RootNode ast = null; using (var inputSlab = new MemoryPoolSlab(inputFile)) using (var outputSlab = new MemoryPoolSlab(new byte[1000000])) { var parseStatus = generate(inputSlab.NativePointer, inputFile.Length, outputSlab.NativePointer, out var descriptorSize); var byteArray = new byte[descriptorSize]; Marshal.Copy(outputSlab.NativePointer, byteArray, 0, (int)descriptorSize); var file = FileDescriptorProto.ParseFrom(byteArray); foreach (var location in file.SourceCodeInfo.LocationList) { nodes.Add(Node.CreateNode(location, text)); } foreach (var node in nodes.OrderByDescending(i => i.Content.Length)) { if (ast == null) { ast = node as RootNode; } else { var targetNode = ast.GetNodeAt(node.StartLine, node.StartCol); targetNode.Children.Add(node); node.Parent = targetNode; } } } return(ast); }
private void OnSlabAllocated(MemoryPoolSlab slab) { var bufferId = _rio.RioRegisterBuffer(slab.ArrayPtr, (uint)slab.Array.Length); _bufferIdMappings[slab.ArrayPtr] = bufferId; }