Exemple #1
0
        internal NativeRuntime.IFabricOperationData Pin(NativeReliableMessaging.IFabricMessageDataFactory messageDataFactory)
        {
            if (null != Interlocked.CompareExchange(ref this.pinCollection, new PinCollection(), null))
            {
                //
                // We do not allow the same ReliableSessionMessage object to be pinned concurrently.
                //
                throw new InvalidOperationException();
            }

            var sizes = this.originalMessage.Select(element => (uint)element.Count).ToArray();

            var bufferCount = (uint)sizes.Length;

            if (bufferCount == 0)
            {
                return(null);
            }

            // pin the IOperationData buffers
            var pinnedBuffers = this.originalMessage.Select(element => this.pinCollection.AddBlittable(element.Array)).ToArray();

            NativeRuntime.IFabricOperationData messageData = null;

            using (PinBlittable pinSizes = new PinBlittable(sizes), pinBuffers = new PinBlittable(pinnedBuffers))
            {
                messageData = messageDataFactory.CreateMessageData(
                    bufferCount,
                    pinSizes.AddrOfPinnedObject(),
                    pinBuffers.AddrOfPinnedObject());
            }

            this.savedNativeMessageRef = messageData;

            return(messageData);
        }