private void Dispose(bool disposing)
        {
            if (disposing && this.disposed)
            {
                throw new ObjectDisposedException(this.GetType().ToString());
            }

            this.disposed = true;

            if (this.pendingDataStream != null)
            {
                this.pendingDataStream.Dispose();
                this.pendingDataStream = null;
            }

            foreach (var pair in this.unmergedData)
            {
                pair.Dispose();
            }
            this.unmergedData.Clear();

            if (this.mergedData != null)
            {
                this.mergedData.Dispose();
                this.mergedData = null;
            }
        }
        private void SealWriteBuffer(QueryableSingleValueData newData)
        {
            var currentData = this.pendingDataStream;

            this.pendingDataStream = newData;

            if (currentData != null)
            {
                currentData.Data.Seal();
                this.AddData(currentData);
            }
        }
        private void AddValue(uint *key, long value)
        {
            // If the single value buffer is either not there or full swap it for a new one.
            if (this.pendingDataStream == null || !this.pendingDataStream.Data.TryWrite(key, value))
            {
                lock (this)
                {
                    if (this.pendingDataStream == null || !this.pendingDataStream.Data.TryWrite(key, value))
                    {
                        var newData = new QueryableSingleValueData(this.memoryStreamManager.GetStream("WriteBuffer"),
                                                                   this.DimensionSet, true);
                        if (!newData.Data.TryWrite(key, value))
                        {
                            throw new InvalidOperationException("Unable to write data??");
                        }

                        this.SealWriteBuffer(newData);
                    }
                }
            }
        }