Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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
            });
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
            }
        }