private unsafe void LogRemoveKeyDirection(K key, int lookup) { if (_allowBatches) { return; } var header = new MessageHeader { UUID = _uuid, MessageType = MessageType.Remove, Version = this.Version }; var commandBody = new SetRemoveCommandBody <K, int> { key = key, value = lookup }; var len = MessageHeader.Size + TypeHelper <SetRemoveCommandBody <K, int> > .Size; BufferClaim claim; _appendLog.Claim(len, out claim); *(MessageHeader *)(claim.Data) = header; TypeHelper <SetRemoveCommandBody <K, int> > .StructureToPtr(commandBody, claim.Data + MessageHeader.Size); claim.ReservedValue = _pid; claim.Commit(); }
private unsafe void LogSetKeyValue(K key, V value) { if (_allowBatches) { return; } var header = new MessageHeader { UUID = _uuid, MessageType = MessageType.Set, Version = this.Version }; var commandBody = new SetRemoveCommandBody <K, V> { key = key, value = value }; MemoryStream ms = null; var len = MessageHeader.Size + TypeHelper <SetRemoveCommandBody <K, V> > .SizeOf(commandBody, ref ms); // version + len header if (TypeHelper <SetRemoveCommandBody <K, V> > .Size <= 0) { len = len + 8; } BufferClaim claim; _appendLog.Claim(len, out claim); *(MessageHeader *)(claim.Data) = header; // TODO reuse ms TypeHelper <SetRemoveCommandBody <K, V> > .StructureToPtr(commandBody, claim.Data + MessageHeader.Size); claim.ReservedValue = _pid; claim.Commit(); }
public SetRemoveCommandBody <TKey, TValue> FromPtr(IntPtr ptr) { if (IsFixedSize) { var entry = new SetRemoveCommandBody <TKey, TValue>(); entry.key = TypeHelper <TKey> .PtrToStructure((ptr)); entry.value = TypeHelper <TValue> .PtrToStructure((ptr + TypeHelper <TKey> .Size)); return(entry); } var version = Marshal.ReadInt32(ptr); var length = Marshal.ReadInt32(ptr + 4); ptr = ptr + 8; TKey key = TypeHelper <TKey> .PtrToStructure(ptr); TValue value = TypeHelper <TValue> .PtrToStructure(ptr + TypeHelper <TKey> .Size); return(new SetRemoveCommandBody <TKey, TValue> { key = key, value = value }); }
public int SizeOf(SetRemoveCommandBody <TKey, TValue> value, ref MemoryStream memoryStream) { if (IsFixedSize) { return(Size); } // variable size requires a memory stream if (memoryStream == null) { memoryStream = new MemoryStream(); } var initialPosition = memoryStream.Position; memoryStream.WriteAsPtr <int>(Version); // placeholder for length memoryStream.WriteAsPtr <int>(0); if (TypeHelper <TKey> .Size <= 0) { throw new NotImplementedException("TODO We now only support fixed key"); } var size = 8 + TypeHelper <TKey> .Size; memoryStream.WriteAsPtr <TKey>(value.key); size += TypeHelper <TValue> .SizeOf(value.value, ref memoryStream); memoryStream.Position = initialPosition + 4; memoryStream.WriteAsPtr <int>((int)memoryStream.Length); Trace.Assert(size == memoryStream.Length - initialPosition); return(size); }
public void ToPtr(SetRemoveCommandBody <TKey, TValue> entry, IntPtr ptr, MemoryStream memoryStream = null) { if (IsFixedSize) { TypeHelper <TKey> .StructureToPtr(entry.key, (ptr)); TypeHelper <TValue> .StructureToPtr(entry.value, (ptr + TypeHelper <TKey> .Size)); } else { if (memoryStream == null) { var size = SizeOf(entry, ref memoryStream); Trace.Assert(size == memoryStream.Length); } memoryStream.WriteToPtr(ptr); } }