Esempio n. 1
0
        private static bool TryParsePartitioned(ChunkedStream input, out RpcPartitionedMessage message)
        {
            message = null;
            if (input == null || !input.CanRead)
            {
                return(false);
            }

            var inputDataLen = input.Length;

            if (inputDataLen < RpcMessageSizeOf.Header)
            {
                return(false);
            }

            var context = new ParserContext
            {
                Input        = input,
                InputLength  = inputDataLen,
                HeaderBuffer = RpcByteBufferCache.HeaderCache.Acquire()
            };

            try
            {
                context.Message = new RpcPartitionedMessage();

                var initialPosition = input.Position;
                input.Position = 0;
                try
                {
                    if (!ParseHeader(context))
                    {
                        return(false);
                    }

                    if (!ParseData(context))
                    {
                        return(false);
                    }
                }
                finally
                {
                    input.Position = initialPosition;
                }

                if (context.Completed)
                {
                    message = context.Message;
                    input.TrimLeft(context.StreamOffset);

                    return(true);
                }
            }
            finally
            {
                RpcByteBufferCache.HeaderCache.Release(context.HeaderBuffer);
            }

            return(false);
        }
Esempio n. 2
0
        private static IWireSerializer GetSerializer(RpcPartitionedMessage message)
        {
            IWireSerializer result = null;

            var serializerKey = message.Header.SerializerKey;

            if (String.IsNullOrEmpty(serializerKey))
            {
                serializerKey = Constants.DefaultSerializerKey;
            }

            _serializerLock.EnterUpgradeableReadLock();
            try
            {
                if (serializerKey == _serializerKey)
                {
                    result = _serializer;
                }
                else
                {
                    _serializerLock.EnterWriteLock();
                    try
                    {
                        _serializer    = (result = RpcSerializerRegistry.Get(serializerKey));
                        _serializerKey = serializerKey;
                    }
                    finally
                    {
                        _serializerLock.ExitWriteLock();
                    }
                }
            }
            finally
            {
                _serializerLock.ExitUpgradeableReadLock();
            }
            return(result);
        }