Exemplo n.º 1
0
        public NanomsgReadStream(IntPtr buffer, long length, INativeDisposer <NanomsgReadStream> disposer)
        {
            if (buffer == null)
            {
                throw new ArgumentNullException("buffer");
            }

            if (length <= 0)
            {
                throw new ArgumentOutOfRangeException("length");
            }

            _buffer   = (byte *)buffer.ToPointer();
            _length   = length;
            _disposer = disposer;
        }
Exemplo n.º 2
0
        private NanomsgReadStream ReceiveStream(SendRecvFlags flags)
        {
            IntPtr buffer = IntPtr.Zero;
            int    rc     = Interop.nn_recv(_socket, ref buffer, Constants.NN_MSG, (int)flags);

            if (rc < 0 || buffer == null)
            {
                return(null);
            }

            /*
             * In order to prevent managed allocations per receive, we attempt to recycle stream objects.  This
             * will work optimally if the stream is disposed before the next receive call, as in this case each
             * socket class will always reuse the same stream.
             *
             * Disposing the stream will both release its nanomsg-allocated native buffer and return it to its
             * socket class for reuse.
             */

            var stream = Interlocked.Exchange(ref _recycledReadStream, null);

            if (stream != null)
            {
                stream.Reinitialize(buffer, rc);
            }
            else
            {
                stream = new NanomsgReadStream(buffer, rc,
                                               _freeReadDisposer ?? (_freeReadDisposer = new NanomsgNativeDisposer()
                {
                    Socket = (NanomsgSocketBase)this
                }));
            }

            return(stream);
        }