public static Slice[] Convert(SliceWriter writer, [NotNull, ItemNotNull] IEnumerable <TValue> values, Handler handler, TState state) { Contract.Requires(values != null && handler != null); //Note on performance: // - we will reuse the same buffer for each temp key, and copy them into a slice buffer // - doing it this way adds a memory copy (writer => buffer) but reduce the number of byte[] allocations (and reduce the GC overhead) int start = writer.Position; var buffer = new SliceBuffer(); var coll = values as ICollection <TValue>; if (coll != null) { // pre-allocate the final array with the correct size var res = new Slice[coll.Count]; int p = 0; foreach (var tuple in coll) { // reset position to just after the subspace prefix writer.Position = start; handler(ref writer, tuple, state); // copy full key in the buffer res[p++] = buffer.Intern(writer.ToSlice()); } Contract.Assert(p == res.Length); return(res); } else { // we won't now the array size until the end... var res = new List <Slice>(); foreach (var tuple in values) { // reset position to just after the subspace prefix writer.Position = start; handler(ref writer, tuple, state); // copy full key in the buffer res.Add(buffer.Intern(writer.ToSlice())); } return(res.ToArray()); } }
public void Dispose() { if (m_disposed) { //TODO: locking ? m_disposed = true; //TODO! m_buffer = null; m_readConflicts = null; m_writeConflicts = null; m_clears = null; m_writes = null; } GC.SuppressFinalize(this); }
private void Initialize(bool first) { if (m_disposed) { ThrowDisposed(); } lock (m_lock) { m_readVersion = null; if (first) { m_committedVersion = -1; // note: current fdb_c client does not reset commited version to -1 when calling fdb_transaction_reset() } m_buffer = new SliceBuffer(InitialBufferSize); if (first) { m_clears = new ColaRangeSet <Slice>(SliceComparer.Default); m_writes = new ColaOrderedDictionary <Slice, WriteCommand[]>(SliceComparer.Default); m_readConflicts = new ColaRangeSet <Slice>(SliceComparer.Default); m_writeConflicts = new ColaRangeSet <Slice>(SliceComparer.Default); } else { m_clears.Clear(); m_writes.Clear(); m_readConflicts.Clear(); m_writeConflicts.Clear(); } m_retryCount = 0; this.AccessSystemKeys = NO_ACCESS; this.NextWriteNoWriteConflictRange = false; this.ReadYourWritesDisable = false; } }