Exemple #1
0
            public unsafe void Send(ReadOnlySpan <byte> message)
            {
                if (!IsConnected)
                    throw new InvalidOperationException("Trying to send when not connected");

                fixed(byte *ptr = message)
                {
                    _buffer.Wrap(ptr, message.Length);

                    var spinWait = new SpinWait();

                    while (true)
                    {
                        var errorCode = _publication.Offer(_buffer, 0, message.Length, _dataReservedValueSupplier);

                        if (errorCode >= 0)
                        {
                            break;
                        }

                        var result = Utils.InterpretPublicationOfferResult(errorCode);

                        if (result == AeronResultType.Success)
                        {
                            break;
                        }

                        if (result == AeronResultType.ShouldRetry)
                        {
                            spinWait.SpinOnce();
                            continue;
                        }

                        _client.SessionDisconnected(this);
                        return;
                    }

                    _buffer.Release();
                }
            }